朱金灿
最近做一个项目,基于公司的一个产品进行开发,使用VC 6.0进行开发,使用到Win API函数OpenThread函数,编译时出现:‘OpenThread”: undeclared identifier 的问题。我查了一下msdn, 其配置要求是:
Requirements
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Included in Windows Me.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
我很奇怪,这个VC 6.0应该支持的啊。开始我以为这是缺补丁之故,把VC 6.0sp6装上(之前已经安装了sp5),编译依然出现‘OpenThread”: undeclared identifier的错误。我上网查了一下资料,发现是Platform SDK版本过低的缘故,于是到网上下载了Win XP sp2 SDK,然后在VC的Tools——〉Option菜单的Include Files和Library Files把Win XP sp2 SDK的相关头文件和库文件的路径添加进去,然后编译程序,发现依然出现:
‘OpenThread”: undeclared identifier的错误。
我又查了一下MSDN, 发现OpenThread函数是在Winbase.h声明的。我把VC安装目录下的VC98文件夹的Winbase.h和Microsoft Platform SDK for Windows XP SP2目录下的Winbase.h都打开比较了一下,发现在Microsoft Platform SDK for Windows XP SP2目录下的Winbase.h对OpenThread函数有声明,而VC98文件夹的Winbase.h则没有。由此我猜到了原因所在:因为在Tools——〉Option菜单的Include Files和Library Files把VC98的头文件和库文件设在Microsoft Platform SDK for Windows XP SP2的前面,因此编译器肯定是优先使用Winbase.h,而不使用Microsoft Platform SDK for Windows XP SP2目录下的Winbase.h,因此解决办法是在Tools——〉Option菜单的Include Files和Library Files把二者的顺序挪一下,把把Win XP sp2 SDK的相关头文件和库文件放在VC98的头文件和库文件的前面,让编译器优先使用。那么能不能把VC98的头文件和库文件在Tools——〉Option菜单的Include Files和Library Files直接删除呢?答案是不行的,因为Microsoft Platform SDK for Windows XP SP2并不包含所有VC98目录下的头文件和库文件,如expct.h和msvcrt.lib。
实际上后来我发现安装完Microsoft Platform SDK for Windows XP SP2在开始菜单上有一组菜单,其中的一个菜单项是:Register PSDK Directorues with visual studio如下图:
单击该菜单,出现一个警告对话框,单击ok后我们再到VC 6.0去看一下,就会发现Win XP sp2 SDK的相关头文件和库文件已经包含进来,而且是在VC98目录的前面,如下图:
在VS 2003上直接建一个MFC应用程序,是可以直接使用OpenThread函数的。这次只是因为我要使用这个软件是使用VC 6.0开发的,直接使用VS 2003打开编译毫无疑问会遇到很多语法错误,如类型转换等错误,因为VS 2003的语法检查比VC 6.0要严格,解决这个问题要花费较多时间。
解决这个问题给了我一个思路:通过优先设置最新SDK的路径,可以让我们使用最新的SDK,同时又可以使用低版本的编译器编译工程,降低工程在不同版本编译器移植的成本。