“程序设计”目录存档

用VBS获取图片分辨率

2010年10月17日,星期日

Windows Image Acquisition (WIA)是个好东西。虽然很久很久以前就知道有这么个东西,但是其时英语很烂,VBS更烂,就没有仔细研究。最近闲来没事,看了一下相关的文档,发现WIA没有想象中的强大,真失望。

Set Img = CreateObject("WIA.ImageFile")
Img.LoadFile "test.jpg"
WScript.Echo "Width = " & Img.Width
WScript.Echo "Height = " & Img.Height

参考链接:Display Detailed Image Information

C语言调用API获取程序自身的路径

2010年10月14日,星期四

VBS获取程序自身的路径很简单

WScript.Echo WScript.ScriptFullName

C语言其实也也很简单,只可惜以前太菜

TCHAR szFileName[MAX_PATH];
GetModuleFileName(NULL, szFileName, MAX_PATH);
MessageBox(NULL, szFileName, TEXT(""), 0);

参考链接:GetModuleFileName Function

GUI程序获取命令行参数

2010年10月13日,星期三

在Console程序中可以用main函数中的argc和argv遍历命令行参数。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;
    for(i = 0;i < argc;i++)
        printf("%s\n", argv[i]);
    return 0;
}

那么在GUI程序中怎么遍历命令行参数呢?虽然WinMain函数的lpCmdLine参数中传入了程序的命令行参数,但是该参数不包含应用程序名(即main函数中的argv[0]),而且自己解析出每个参数也比较麻烦。

最简单的方法是先用GetCommandLineW函数获取命令行,然后用CommandLineToArgvW函数将命令行转化成C语言main函数argc和argv的形式。

#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int WINAPI WinMain(HINSTANCE hInstance, 
            HINSTANCE hPrevInstance, 
            LPSTR lpCmdLine, 
            int nShowCmd)
{
    LPWSTR *szArglist;
    int nArgs, i;
    
    szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
    for (i = 0; i < nArgs; i++)
    {
        MessageBoxW(NULL, szArglist[i], L"", 0);
    }
    return 0;
}

只可惜没有CommandLineToArgvA函数,想用ANSI版的话得自己用WideCharToMultiByte函数转换一下。

Visual C++ 常用的文件扩展名

2010年10月11日,星期一

用Visual C++时间也不短了,但是从来没有去研究过它生成的那些乱七八糟的文件有什么用。今天特地查了一下,只列出我感兴趣的,详细的资料请查看参考链接。

  • .APS – 二进制形式的资源文件:
    这种文件是二进制形式的当前资源文件。App Studio 或资源编辑器使用该文件进行快速加载。
  • .PCH – 预编译头文件:
    这些文件可以大大提高编译速度。如果使用 /Yc、/Yu 或 /YX 编译器选项,将创建这些文件。
  • .PDB – 程序数据库文件:
    这种二进制文件中包含在编译和链接项目过程中收集的类型和符号形式的调试信息。这种文件用于 Visual C++ 调试器。对象文件包含对 .PDB 文件中有关调试信息的引用。这种设计减小了对象文件的大小。有关更多信息,请参见 /Zi 开关下的联机参考。使用 /Z7 开关时,并不创建这种文件。
  • .NCB – 分析器信息文件:
    这种文件包含类视图和组件库使用的分析器生成的信息。如果这种文件被有意或无意删除,它会自动重新生成。

参考链接:INFO:Visual C++ 常用的文件扩展名

VC6中使用高版本API的方法

2010年10月10日,星期日

今天用VC6重新编译一个以前写过的程序。程序中使用了API函数SetWindowsHookEx,某段代码如下

SetWindowsHookEx(WH_KEYBOARD_LL,KeyHookProc,hInstance,0);

Visual Studio 2008太大了我没有安装,只安装了Visual C++ 6.0和Microsoft Platform SDK February 2003。这个程序以前用VC9(即VC2008)编译没有任何问题,但是今天用VC6编译的时候竟然报错:

error C2065: 'WH_KEYBOARD_LL' : undeclared identifier

MSDN文档上说WH_KEYBOARD_LL要求系统必须至少为Windows NT/2000/XP,我的系统是Windows 2008 R2,怎么还会报错说未定义呢?百思不得其解。

文档说WH_KEYBOARD_LL Declared in Winuser.h,好吧,我就打开Winuser.h看了一下,终于找到了原因:

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#endif // (_WIN32_WINNT >= 0x0400)

罪魁祸首就是这个_WIN32_WINNT,只有当它大于0x0400的时候才定义WH_KEYBOARD_LL。

(更多…)