vc6.0+DDK(xp-2600)游戏手柄按键信息获取程序出现的编译错误

最近帮一个师兄做游戏手柄按键信息获取的小程序,用到了winxp_ddk,版本是2600的,在网上找了半天才找到一个安装文件,安装后,在vc中设置include和lib的目录,分别是"D:\WINDDK\2600\inc\wxp"和"D:\WINDDK\2600\lib\wxp\i386" (假如安装在D盘),vc中的程序头文件及符号库代码添加如下:
#include <stdio.h> #include <windows.h> #include <wxp/hidsdi.h> #include <wxp/hidpi.h> #include <setupapi.h> #pragma comment(lib, "setupapi.lib") #pragma comment(lib, "hid.lib")
........................
后续的代码就省略了,保存后直接编译,没有错误,点击link,结果出来七个错误:
Linking...
joystick_test.obj : error LNK2001: unresolved external symbol "long __stdcall HidP_GetCaps(struct _HIDP_PREPARSED_DATA  *,struct  _HIDP_CAPS *)" (?HidP_GetCaps@@YGJPAU_HIDP_PREPARSED_DATA@@PAU_HIDP_CAPS@@@Z)
joystick_test.obj : error LNK2001: unresolved external symbol "unsigned char __stdcall HidD_GetPreparsedData(void *,struct  _HIDP_PREPARSED_DATA * *)" (?HidD_GetPreparsedData@@YGEPAXPAPAU_HIDP_PREPARSED_DATA@@@Z)
joystick_test.obj : error LNK2001: unresolved external symbol "unsigned char __stdcall HidD_GetProductString(void *,void *,unsigned  long)" (?HidD_GetProductString@@YGEPAX0K@Z)
joystick_test.obj : error LNK2001: unresolved external symbol "unsigned char __stdcall HidD_GetManufacturerString(void *,void  *,unsigned long)" (?HidD_GetManufacturerString@@YGEPAX0K@Z)
joystick_test.obj : error LNK2001: unresolved external symbol "unsigned char __stdcall HidD_GetAttributes(void *,struct  _HIDD_ATTRIBUTES *)" (?HidD_GetAttributes@@YGEPAXPAU_HIDD_ATTRIBUTES@@@Z)
joystick_test.obj : error LNK2001: unresolved external symbol "void __stdcall HidD_GetHidGuid(struct _GUID *)" (? HidD_GetHidGuid@@YGXPAU_GUID@@@Z)
Release/CJoyStick.exe : fatal error LNK1120: 6 unresolved externals
Error executing link.exe.

CJoyStick.exe - 7 error(s), 0 warning(s)

一看就知道是库文件出了问题,通过DDK的帮助文件查询后才发现,这些所谓的链接错误都在hid.lib库文件中,hid.lib的路径也是对的,是怎么回事呢,想了许久,怀疑是hid.lib中的函数是采用C标准写的,那么我们采用C++标准去调用这些库函数是的话就会造成函数命名的错误,因为C编译出来的库函数就是函数名本身,而C++(比如在VC中)会在函数名本身的基础上添加一长串字符,导致命名冲突,所以我认为是lib中的函数名称是调用的库函数名本身,而我们在代码中调用的却是按照C++方式在函数名本身的基础上添加了其它字符串的名称,于是乎将头文件进行修改:

//因为被调用函数是采用传统C语言编写 所以在C++中调用时加上extern "C"保证链接时能够直接根据调用函数
//名找到被调用的函数 by yiyun 2011-03-29
改成:
extern "C"
 
#include <hidsdi.h> 
#include <hidpi.h> 
#include <setupapi.h> 
再次点击编译链接,问题解决了。看来自己的分析没有错,哈哈。。。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/gongjun12345/article/details/8796148