繁体   English   中英

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

[英]Delphi/C++ DLL problem - unsigned long vs unsigned int?

(已解决:请参见自我答复。感谢回答者)。

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

__declspec(dllexport)int foo(unsigned int A,无符号长bitsetVector);

我在Delphi函数中将函数指针转换为:

foo:function(A:LongWord; bitsetVector:LongWord):整数; stdcall;

我映射到DLL的几乎所有其他调用都可以正常工作,但是此调用返回“无效位集字段”错误,表明它不喜欢bitsetVector值。 通过使用OR运算符设置位来构建bitsetVector参数。 当然,用于设置位的所有枚举常量均为2的幂。 我很确定这是某种类型的强制转换错误,所以我想知道我不知道“ unsigned int”与“ unsigned long”之间是否存在细微差别。 MSDN C ++文档将它们都显示为4个字节,范围从0到4,294,967,295,因此它们对我来说看起来是相同的。

Bizarro注意。 我尝试运行范围为0到100的for循环,在这里我刚刚将for迭代器变量(i)作为位集向量传递。 所有奇数均失败,而所有偶数均成功。 这就是为什么我觉得这是一个转换错误。 注意,我没有损坏或内存错误。 我对FastMM4进行了全面检查,尽管有几个DLL调用接收到LongWord参数,并且通常“出”参数通常在DLL集成不匹配中首先遭受损失,但是没有堆栈崩溃或堆损坏。 另外,我从C ++ DLL中获得的值看起来也不错。

我想知道,如果外面有人对此有任何想法或想法,或者可能有一些切向知识可以揭示真正的问题(如果不是铸造问题)。

谢谢。

感谢那些回应。 事实证明,这是症状真正令人误解的情况之一。 真正的问题是,用于设置位的第一个枚举常量在调用的上下文中当然是非法的,该位的值当然为1。 这就是为什么只有“偶数”位集值成功的原因。 完全是因为不存在非法的枚举值。 事实证明DLL链接是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM