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 ,同时又可以使用低版本的编译器编译工程,降低工程在不同版本编译器 移植的成本。
或者:
typedef
HANDLE
(*OPENTHREAD)
(DWORD
dwFlag,
BOOL
bUnknow,
DWORD
dwThreadId);
OPENTHREAD
lpfnOpenThread
=
(OPENTHREAD)GetProcAddress(LoadLibrary("kernel32.dll"),"OpenThread");
HANDLE
hThread
=
lpfnOpenThread(THREAD_SET_CONTEXT,
FALSE,
__dwMainThreadId);
这样用即可。