gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:27:02 25 4
gpt4 key购买 nike

(已解决:请参阅 self 回复。感谢那些回答的人)。

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

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

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

foo:函数(A:LongWord;bitsetVector:LongWord):整数;标准调用;

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

奇怪的笔记。我尝试运行一个范围为 0 到 100 的 for 循环,其中我刚刚将 for 迭代器变量 (i) 作为位集 vector 传递。 所有奇数都失败,而所有偶数都成功。这就是为什么我觉得这是一个转换错误。请注意,我没有损坏或内存错误。我对 FastMM4 进行了全面检查,没有堆栈崩溃或堆损坏,尽管事实上有几个 DLL 调用接收 LongWord 参数并且通常“out”参数通常首先在 DLL 集成不匹配中受到影响。此外,我从 C++ DLL 返回的值看起来是正确的。

如果有人对此有任何想法或想法,或者如果它不是类型转换问题,可能有一些可能揭示真正问题的切题知识,我想知道。

谢谢。

最佳答案

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

关于c++ - Delphi/C++ DLL 问题 - unsigned long 与 unsigned int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3648652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com