首页 文章

Delphi / C DLL问题 - unsigned long vs unsigned int?

提问于
浏览
0

(已解决:见自我答复 . 感谢那些回答的人) .

我有一个C DLL的奇怪问题我正在动态加载到我的Delphi 6 Pro程序中 . DLL中的一个函数调用是:

__declspec(dllexport)int foo(unsigned int A,unsigned long bitsetVector);

我的函数指针在我的Delphi函数中强制转换为:

foo:function(A:LongWord; bitsetVector:LongWord):integer; STDCALL;

我已经映射到DLL的几乎所有其他调用工作正常,但是这个调用返回“无效的bitset字段”错误,表明它不喜欢bitsetVector值 . 通过使用OR运算符设置位来构建bitsetVector参数 . 用于设置位的所有枚举常量当然是2的幂 . 我很确定这是一个演员错误,所以我想知道是否有一些关于“unsigned int”和“unsigned long”的细微差别,我不知道 . MSDN C文档将它们显示为4个字节,每个字节的范围为0到4,294,967,295,因此它们看起来与我相同 .

Bizarro说明 . 我尝试运行for循环,范围为0到100,其中我刚刚传递for iterator变量(i)作为bitset向量 . All the odd number values failed while all the even numbers succeeded. 这就是为什么我觉得这是一个投射错误 . 注意,我没有损坏或内存错误 . 我使用FastMM4进行了全面检查,并且没有堆栈崩溃或堆损坏,尽管有几个DLL调用接收LongWord参数,并且通常"out"参数通常在DLL集成不匹配中首先受到影响 . 此外,我从C DLL返回的值看起来正确 .

如果那里的任何人对此有任何想法或想法,或者可能是一些可能揭示真正问题的切向知识,如果它不是铸造问题,我想知道 .

谢谢 .

1 回答

  • 1

    感谢那些回应的人 . 事实证明这是症状确实具有误导性的案例之一 . 真正的问题是,用于设置位的第一个枚举常量(当然值为1)在调用的上下文中是非法的 . 这就是为什么只有“偶数”的bitset值成功的原因 . 这完全是因为没有非法的查点 Value . 事实证明DLL链接是合理的 .

相关问题