将记录作为函数结果从 Delphi DLL 传递到 C++

2024-03-13

我现在正在经历一些非常奇怪的事情。 当我将结构从 C++ 传递到 Delphi DLL 作为参数时,一切正常。 但是,一旦我想收到结果记录,我要么得到错误的值,要么得到异常。 我禁用了记录的对齐,以便通过它们应该可以! 这是代码!

德尔福动态链接库:

TSimpleRecord = packed record
  Nr1 : Integer;
  Nr2 : Integer;
end;

//...

function TTest() : TSimpleRecord; cdecl;
begin
  Result.Nr1 := 1;
  Result.Nr2 := 201;
  ShowMessage(IntToStr(SizeOf(Result)));
end;

C++ 调用:

#pragma pack(1)
struct TSimpleRecord
{
    int Nr1;
    int Nr2;
};

//...

    typedef TSimpleRecord (__cdecl TestFunc)(void);
    TestFunc* Function;
    HINSTANCE hInstLibrary = LoadLibrary("Reactions.dll");
    if (hInstLibrary)
    {
        Function = (TestFunc*)GetProcAddress(hInstLibrary, "TTest");
        if (Function)
        {
            TSimpleRecord Result = {0};
            Result = Function();
            printf("%d - %d - %d", sizeof(Result), Result.Nr1, Result.Nr2);
            cin.get();
        }
    }

我不知道为什么将此记录作为参数传递有效,但不能作为函数的结果传递!?

有人能帮我吗?

Thanks

PS:正如我所说,C++和Delphi都显示记录是8字节大。


有些编译器会返回struct类型(可能取决于大小)在寄存器中,其他人会添加一个隐藏的额外参数来存储结果。不幸的是,看起来您正在处理两个编译器,它们在如何返回这些内容上没有达成一致。

您应该能够通过显式使用来避免该问题out参数代替。

procedure TTest(out Result: TSimpleRecord); cdecl;
begin
  Result.Nr1 := 1;
  Result.Nr2 := 201;
end;

不要忘记相应地更新 C++ 代码。

鲁迪·维尔修斯 (Rudy Velthuis) 写过相关文章 http://rvelthuis.de/articles/articles-convert.html:

这向我展示了 ABCVar 结构体在寄存器 EDX:EAX 中返回(EDX 具有最高 32 位,EAX 具有较低位)。这根本不是 Delphi 处理记录的方式,即使处理这种大小的记录也是如此。 Delphi 将此类返回类型视为额外的 var 参数,并且不返回任何内容(因此该函数实际上是一个过程)。

[...]

Delphi 以 EDX:EAX 组合形式返回的唯一类型是 Int64。

这表明避免该问题的另一种方法是

function TTest() : Int64; cdecl;
begin
  TSimpleRecord(Result).Nr1 := 1;
  TSimpleRecord(Result).Nr2 := 201;
end;

请注意,即使在 C++ 中未定义行为的情况下,Delphi 也允许此类类型双关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将记录作为函数结果从 Delphi DLL 传递到 C++ 的相关文章

随机推荐

  • PyCharm 3.0 找不到 PyQt5

    我安装了 Python 3 3 2 x86 和 x64 版本 并在其上安装了 PyQt5 1 Recently I installed PyCharm 3 0 Community Edition and configured to work
  • 如何使用最新的应用程序目录获取 nextjs 13 应用程序内的路由路径名? “服务器端”[重复]

    这个问题在这里已经有答案了 我正在 Next js 13 中使用实验性的 appDir 并且想要获取请求的 URL 路径 在进行重定向之前 我需要此信息来设置搜索参数 我想获取服务器端的请求路径 有一个与此类似的问题 如何使用 Next 1
  • 我们可以在 JSF2 复合组件中拥有组件范围的 bean 吗?

    我想知道如何创建 组件范围 bean 或者说 复合组件内的局部变量 这些变量对于复合组件的实例来说是私有的 并且只要该实例存在就一直存在 下面是更多详细信息 并通过示例进行了解释 假设有一个 计算器 组件 允许用户输入数学表达式并计算其值
  • 将react-native与react-relay一起使用时,引用节点模块的箭头函数中的自动绑定被破坏

    我正在使用react native和react relay 因此我有以下 babelrc 文件 sourceMaps both presets plugins babelRelayPlugin react native passPerPre
  • 从 Python 调用 Cython C 函数

    我有一个Cython http cython org 文件名为foo pyx包含以下功能 def add one int n cdef int m n 1 return m cdef int c add one int n return n
  • 为什么使用 __get_free_pages() 进行顺序为 10 或 11 的页面分配通常会失败?

    我的系统内存充足 24GB的服务器 在我的系统中 内核空间分配了320MB和120MB用于崩溃内核 其余的内存用于其他目的 但是 当我使用 get free pages 分配顺序为 11 的连续页 内核无法分配 2 10 页 为什么 根据制
  • Devise、Rolify 和 Cancan 到 ActiveAdmin

    我正在使用 Devise Rolify 和 CanCan 开发一个应用程序 我可以将其完全转变为由 ActiveAdmin 管理吗 有相关文件吗 我知道问题被提出已经有一段时间了 但是当我在谷歌搜索时发现它时 我想我可以发布一个答案来帮助其
  • R:使用基于时间的窗口计算按 id 变量分组的不规则时间序列的滚动总和

    我喜欢 R 但有些问题实在是太难了 面临的挑战是在基于时间的窗口大于或等于 6 小时的不规则时间序列中找到滚动总和小于 30 的第一个实例 我有该系列的样本 Row Person DateTime Value 1 A 2014 01 01
  • React js将状态从父组件设置为子组件

    所以我有一个父组件和子组件 父级将搜索栏中输入的任何内容作为道具传递给子级 然后应该执行 api fetch 我在控制台中看到了 fetch 对象 我在从父母那里设置孩子的状态时遇到困难 任何提示将不胜感激 谢谢您并快乐编码 D class
  • Jquery 同级在警报中显示未定义

    Jquery兄弟显示未定义 我有数量字段和总金额字段 当用户在总金额字段中输入任何内容时 我必须显示警报数量 我暂时不关心数量 因为我必须理解为什么我的 jquery 兄弟姐妹不工作 当我输入任何数字时 我的警报中就会出现未定义的情况 这不
  • 如何将 PDF 合并到单个文件而不需要相同字体的多个副本?

    我创建 PDF 并将它们连接成一个 PDF 我生成的 PDF 文件大小比我预期的要大得多 我意识到我的输出 PDF 有大量重复字体 这就是文件大小出乎意料地大的原因 在这里 我的问题是 我想创建仅嵌入字体信息的 PDF 因此让它们使用 Wi
  • 在 SQL Server 中,如何为给定表生成 CREATE TABLE 语句?

    我花了很多时间来解决这个问题 所以本着这个帖子 https stackoverflow com questions 21245 questions vs conveying information 我将其发布在这里 因为我认为它可能对其他人
  • 相当于 jQuery .is() 的 JS

    是否有 jQuery 的纯 JS 等价物 is 在现代浏览器上 我知道有querySelector方法 但我想检查节点本身 而不是查找子节点 好像matchesSelector就是我想要的 https developer mozilla o
  • 从txt文件中删除字符串

    所以基本上我想要deletetxt 文件中的字符串 using fs 输入示例 string1 string2 string3 string4 Delete string3 删除后会是这样的 string1 string2 string4
  • NLTK 中解析的英语语法

    是否有现成的英语语法可供我加载并在 NLTK 中使用 我搜索了使用 NLTK 进行解析的示例 但似乎我必须在解析句子之前手动指定语法 多谢 你可以看一下pyStat解析器 https github com emilmont pyStatPa
  • npm-link 库上的挂钩调用无效

    问题描述 我目前正在编写一个名为eformless 我用过CRA https github com facebook create react app创建一个名为的目录sandbox 我链接包的地方 当尝试使用我尝试测试的链接包启动沙盒反应
  • 向不记名令牌 json 添加更多值

    我想在用户成功登录后返回用户名 以显示在我的网络应用程序的右上角 我想用令牌返回的 json 来发送它 为了生成令牌身份验证 我使用 ASP NET Web API 和 Owin middlehawe access token blah t
  • 如何在Chrome devtools元素检查器中搜索标签+属性?

    我在 devtool 中进行了简单的搜索 但它无缘无故地急剧下降 更重要的是 如果我查看源代码并进行相同的搜索 结果数 link rel link contains rel style 或 CSS 选择器 link rel link rel
  • Windows 窗体 ListView 缺少水平滚动条

    我在表单 C VS 2005 中有一个 Windows 窗体 ListView 并将其锚定到表单的所有边缘 以便它完全填充表单 不包括状态栏 ListView 处于详细模式 并且列非常宽 绝对比显示区域宽 我有一个垂直滚动条 但没有水平滚动
  • 将记录作为函数结果从 Delphi DLL 传递到 C++

    我现在正在经历一些非常奇怪的事情 当我将结构从 C 传递到 Delphi DLL 作为参数时 一切正常 但是 一旦我想收到结果记录 我要么得到错误的值 要么得到异常 我禁用了记录的对齐 以便通过它们应该可以 这是代码 德尔福动态链接库 TS