1

我正在尝试链接一个 DLL,但我经常遇到UINT32.

该库是针对 4.1 版本的 Visual Studio 编译器编译的。我的组件的接口(它是 4.1,我现在正在移植到 2012)在UINT32其中定义了许多 s。在 VC4.1UINT32中不是由编译器定义的,因此它是unsigned long由程序员定义的,但从 VC6 开始,UINT32它被定义为unsigned int. 这让我的生活变得艰难。

我最初的反应是尝试将UINT32界面中的所有内容替换为unsigned long并重新编译。这是因为函数签名是相同的。然而unsigned long,2012 年的 a 是 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 库中定义了一个符号,为该符号dwOamGetuserDetailsrake 并返回一个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)

这实际上是从库到组件的回调,因此在这种情况下,它正在寻找与库(unsigned long)定义的 UINT32 匹配的签名,但组件正在为其回调定义一个 unsigned int。

4

0 回答 0