• ‘OpenThread”: undeclared identifier 问题的解决之道


                               朱金灿 

    最近做一个项目,基于公司的一个产品进行开发,使用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,然后在VCTools——〉Option菜单的Include FilesLibrary FilesWin XP sp2 SDK的相关头文件和库文件的路径添加进去,然后编译程序,发现依然出现:

    ‘OpenThread”: undeclared identifier的错误。

     我又查了一下MSDN, 发现OpenThread函数是在Winbase.h声明的。我把VC安装目录下的VC98文件夹的Winbase.hMicrosoft Platform SDK for Windows XP SP2目录下的Winbase.h都打开比较了一下,发现在Microsoft Platform SDK for Windows XP SP2目录下的Winbase.hOpenThread函数有声明,而VC98文件夹的Winbase.h则没有。由此我猜到了原因所在:因为在Tools——〉Option菜单的Include FilesLibrary FilesVC98的头文件和库文件设在Microsoft Platform SDK for Windows XP SP2的前面,因此编译器肯定是优先使用Winbase.h,而不使用Microsoft Platform SDK for Windows XP SP2目录下的Winbase.h,因此解决办法是在Tools——〉Option菜单的Include FilesLibrary Files把二者的顺序挪一下,把把Win XP sp2 SDK的相关头文件和库文件放在VC98的头文件和库文件的前面,让编译器优先使用。那么能不能把VC98的头文件和库文件在Tools——〉Option菜单的Include FilesLibrary Files直接删除呢?答案是不行的,因为Microsoft Platform SDK for Windows XP SP2并不包含所有VC98目录下的头文件和库文件,如expct.hmsvcrt.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,同时又可以使用低版本的编译器编译工程,降低工程在不同版本编译器移植的成本。

     

     
  • 相关阅读:
    附加数据库对于服务器失败5120
    c#程序调试没有问题,Ctrl+F5运行就挂
    c#让某个窗体一直显示于桌面最上方
    c#调用GrADS
    备份对于服务器“”失败,加载的介质已格式化为支持1个介质簇,但根据指定的备份设备,应支持2个介质簇
    Assembly.Load()出错
    对控件部分的截图和录像
    创建oracle本地数据库步骤详解
    基于windows的resin配置
    oracle 插入记录,字段自动获取当前系统时间(YYYY-MM-DD HH24:MI:SS)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471291.html
Copyright © 2020-2023  润新知