朱金灿
最近做一个项目,基于公司的一个产品进行开发,使用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如下图:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 259.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CCLEVER~1.OTI%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>
单击该菜单,出现一个警告对话框,单击ok后我们再到VC 6.0去看一下,就会发现Win XP sp2 SDK的相关头文件和库文件已经包含进来,而且是在VC98目录的前面,如下图:
<shape id="_x0000_i1026" style="WIDTH: 411.75pt; HEIGHT: 290.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CCLEVER~1.OTI%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png"></imagedata></shape>
<shape id="_x0000_i1027" style="WIDTH: 411.75pt; HEIGHT: 290.25pt" type="#_x0000_t75"></shape>
<shape style="WIDTH: 411.75pt; HEIGHT: 290.25pt" type="#_x0000_t75"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/clever101/07111702.JPG"></shape>
<shape style="WIDTH: 411.75pt; HEIGHT: 290.25pt" type="#_x0000_t75"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/clever101/07111703.JPG"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CCLEVER~1.OTI%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.png"></imagedata></shape>
在VS 2003上直接建一个MFC应用程序,是可以直接使用OpenThread函数的。这次只是因为我要使用这个软件是使用VC 6.0开发的,直接使用VS 2003打开编译毫无疑问会遇到很多语法错误,如类型转换等错误,因为VS 2003的语法检查比VC 6.0要严格,解决这个问题要花费较多时间。
解决这个问题给了我一个思路:通过优先设置最新SDK的路径,可以让我们使用最新的SDK,同时又可以使用低版本的编译器编译工程,降低工程在不同版本编译器移植的成本。