最近做一个项目,基于公司的一个产品进行开发,使用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 如下图: