我正在尝试关联DLL,但我不断遇到UINT32
的问题。
该库是根据Visual Studio编译器的4.1版本编译的。我的组件的接口(4.1和我现在移植到2012)定义了许多UINT32
s。在VC4.1中,UINT32
未由编译器定义,因此程序员将其{i}类型定义为unsigned long
,但从VC6开始UINT32
定义为unsigned int
。这让我的生活变得艰难。
我最初的反应是尝试用UINT32
替换接口中的所有unsigned long
并重新编译。这有效,因为功能签名是相同的。但是,2012年的unsigned long
是64位宽...而不是32位。在大多数情况下这不是问题,但我预见到标志参数和返回类型可能存在问题。
我想知道的是,如果我错过了一个更明显的解决方案。我想过定义一个不同的类型
typedef OAM_UINT32 unsigned long //in the library
typedef OAM_UINT32 unsigned int // in my component
但问题与我对UINT32的两个定义已经存在的问题是一样的......对吗?
非常感谢任何帮助。
问题
客户端代码
#include <oam_if.h>
....
UINT32 uuid = getSomeLocalUserId();
UINT32 dwOamRetVal = dwOamGetUserDetails( uuid ); // LINK ERROR: Symbol not found
oam_if.h
UINT32 dwOamGetUserDetails( UINT32 idOfUser );
编译库(OAM)时,UINT32值被评估为unsigned long
。编译客户端组件时,UINT32的计算结果为unsigned int
。链接器抱怨是因为它在OAM库中为dwOamGetuserDetails
定义了一个符号,它耙起并返回一个unsigned long
,但是客户端正在调用一个根据它应该采用unsigned int
的函数。
因此,虽然它们各自的输入都是32位长的无符号数,但函数的签名是不同的,并且链接器会抱怨。
我能看到修复它的唯一方法是直接将所有内容定义为unsigned long
。但是,OAM将使用32位长数字,但客户端将使用64位数字!
链接器错误示例
错误LNK2001:未解析的外部符号“public:virtual unsigned long __thiscall Message :: getCallId(void)const”(?getCallId @ Message @@ UBEKXZ)oam.lib(OAM_SsRequest.obj)
这实际上是从库到组件的回调,因此在这种情况下,它正在查找与libary(unsigned long)定义的UINT32匹配的签名,但组件为其回调定义了unsigned int。 / p>