(已解决:见自我回复。感谢那些回答的人)。
我在使用C ++ DLL时遇到了一个奇怪的问题我正在动态加载到我的Delphi 6 Pro程序中。 DLL中的一个函数调用是:
__ declspec(dllexport)int foo(unsigned int A,unsigned long bitsetVector);
我的函数指针在我的Delphi函数中强制转换为:
foo:function(A:LongWord; bitsetVector:LongWord):整数; 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向量。 所有奇数值都失败,而所有偶数都成功。这就是为什么我觉得这是一个投射错误。注意,我没有损坏或内存错误。我使用FastMM4进行了全面检查,并且没有堆栈崩溃或堆损坏,尽管有几个DLL调用接收LongWord参数,并且通常“out”参数通常在DLL集成不匹配中首先受到影响。此外,我从C ++ DLL返回的值看起来是正确的。
如果有任何人对此有任何想法或想法,或者某些切向知识可能会揭示真正的问题,如果它不是铸造问题,我想知道。
感谢。
答案 0 :(得分:1)
感谢那些回复的人。事实证明这是症状确实具有误导性的案例之一。真正的问题是,用于设置位的第一个枚举常量(当然值为1)在调用的上下文中是非法的。这就是为什么只有“偶数”的bitset值成功的原因。这完全是因为没有非法的查点价值。事实证明DLL链接是合理的。