Browsing Tag 'VC'

最近在在把一些程序从VC6迁移到VS2008,由此而关注到了Winodws版本的定义问题。 关于版本定义的关键无外乎为程序头文件中对于#define WINVER 和 #define _WIN32_WINNT 的使用,具体为: #define WINVER 0xXXXX #define _WIN32_WINNT 0xXXXX 该定义一般用于标示程序对运行环境的要求,另外在某些头文件中也有这样的宏定义。如果版本匹配的话就会在编译的时候将这些内容编译,否则就不编译。 定义正确的Windows版本,不仅关系到程序的正确编译,同时也关系到程序的正确运行;在升级的过程中,我就碰到了程序编译正确但运行出错的问题。实例稍候再续。 版本的定义关系到被编译到程序中的内容,这里主要是指系统提供的功能代码。Windows各个版本的功能虽然大差不差,但特定于某个系统功能还是存在的,于是关系到这些功能的API代码也就有所不一样。当我们在程序中定义了错误的系统版本,被编译进程序的内容便可能包含当前系统不支持的代码片段,这样的程序即使可能正确编译通过,但在运行的时候,由于在当前系统中找不到相应的内容资源,从而发生错误。这一点熟悉动态链接库(DLL)的人都很清楚,其实该问题就是和系统动态链接库有关。 Example: 下面为一段获取系统信息提示框的字体信息的代码片段:(编译环境从VC6迁移至VS2008,运行系统为Windows XP) // Retrieves the message font info NONCLIENTMETRICS ncm; ncm.cbSize = sizeof(NONCLIENTMETRICS); VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));   // Creates the font according to the message font info m_Font.CreateFontIndirect(&(ncm.lfMessageFont)); 程序在VC6下编译运行都正确,迁移至VS2008后,编译正确,但运行时出错。原因是SystemParametersInfo调用失败,这和其传入的参数有关,根本在于 NONCLIENTMETRICS 这个结构体变量的定义。

Read more...

Just in Works

Dec 18, 2007 No Comments

MFC开发中,利用LoadCursor(该函数有两个,一个是SDK的,一个是类CWinApp中的)来加载光标。 1.使用系统预设的光标: HCURSOR hCursor = ::LoadCursor(NULL, IDC_ARROW); 第一个参数须为NULL。注意,传递IDC_HAND(设置手形的光标)的时候,如果系统是Windows 98/Me, Windows 2000/XP,须在 #include <afxwin.h> 语句前加上 #define WINVER 0×0500 (主要是用来指明所运行的系统类别),方得以成功编译并实现手形光标的加载。 2.使用自定义的光标,假如已在资源中建立ID为 IDC_MYCURSOR 的光标, HCURSOR hCursor = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_MYCURSOR)); 据同事及网上的朋友介绍,他们以前这样用基本上都是没问题的。不过在我的程序中,就奇了怪了,获得的hCursor 值一直为空。经测试,AfxGetInstanceHandle() 返回的值正确,下面考虑是不是MAKEINTRESOURCE()这个宏里出了问题,具体有待解决。 替代方案: HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR); // OK, no problem here! 疑惑,这里又有点不明白。按理说,类中的LoadCursor在底层实现的时候还是要调用SDK的LoadCursor… Next a problem 在网上讨论了一阵,还是没有解决,最后还是冷静地停了下来,仔细地想了想,就这样,也竟然发现了问题的根源。 关于所建资源的ID号,外加引号的问题。经证实,若某个资源ID号的定义并不在该资源文件所包含的头文件中时,系统(这里指VC++6)会自动给该资源ID加上引号。一旦加上引号,貌似有些调用就得修改了,具体情况似乎得具体对待。当然也可以自行加上引号,然后一切按字符串方式传递。 有时觉得自己在钻牛角尖,也经常犹豫,在想这些繁多而琐碎的细节到底值不值得去花时间关注。对于这样的工作,细节的问题不可避免,但一直这样,总觉得难成气候,但如果不去解决,工作就会受阻,总之挺烦人的。 可能是我还没平衡好吧,希望这只是暂时的… 没有什么是放之四海而皆准的,写程序时也是,最好把各个接口的条件给限制好了,当然也得说明清楚!

Read more...

Flickr Photostream