2010-09-06 63 views
0

(已解决:请参阅自我回复。感谢那些回答)。德尔福/ C + + DLL的问题 - 无符号长与无符号整型?

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

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

我在我的Delphi函数的函数指针铸造为:

FOO:功能(A:长字; bitsetVector:长字):整数; STDCALL;

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

Bizarro note。我试着运行一个for循环,范围从0到100,我刚刚通过迭代器变量(i)作为bitset向量。 所有奇数值均失败,而所有偶数成功。这就是为什么我觉得这是一个铸造错误。请注意,我没有损坏或内存错误。我对FastMM4进行了全面检查,尽管事实上有几个DLL调用接收LongWord参数,并且通常“out”参数通常首先在DLL集成不匹配中遭遇,但没有堆栈崩溃或堆损坏。此外,我从C++ DLL中获得的值看起来是正确的。

如果有人对此有任何想法或想法,或者是一些可能揭示实际问题(如果不是演员问题)的切向知识,我想知道。

谢谢。

+1

显示导致您问题的实际代码 - 函数声明正常。 – kludg 2010-09-06 02:40:16

+1

这可能很愚蠢,但基于“奇数失败”部分和“所有都是2的幂” - 您确定您已经和/或正确定义了2^0 = 1的枚举常量,并且该DLL可以接受'1'(或奇数)值?低位是否有某种特殊意义?有没有一个太多或一个太少的左移位和/或右移位? – shunty 2010-09-06 07:08:40

回答

1

感谢那些回复。事实证明,这是症状确实具有误导性的案例之一。真正的问题是用于设置位的第一个枚举常量(当然值为1)在调用中是非法的。这就是为什么只有“偶数”比特值成功了。这完全是因为非法查点价值不存在。事实证明,DLL链接是健全的。