要从 Delphi 调用的 C++ dll 函数 - 数组参数

Posted

技术标签:

【中文标题】要从 Delphi 调用的 C++ dll 函数 - 数组参数【英文标题】:C++ dll function to be called from Delphi - array parameter 【发布时间】:2021-08-26 06:20:40 【问题描述】:

我需要编写 C++ dll 函数,参数之一是数组。但他的函数也会从 Delphi 代码中调用。所以我假设我不能只写 std::vector 或 std::array。 我现在已经开始阅读有关 Delph 的内容,但也许一些好心人会在这里为我指出正确的解决方案:)

【问题讨论】:

传递一个指向内存缓冲区的指针和这个缓冲区的大小。定义关于谁分配和释放缓冲区(调用者或被调用者)的规则。 使用简单的记忆而不是语言相关的类型,这些类型为您带来方便。提供一个示例,说明为什么它必须是一个数组。 @AndreasRejbrand 长度通常比大小更可取 @DavidHeffernan:我同意,应该是长度。 这里是一个您可能会发现非常有用的网站的链接:rvelthuis.de/articles/articles-dlls.html 【参考方案1】:

数组不给出其元素的数量。因此,必须在进一步的参数/路由中提供该编号。

字符串是指针。因此,该值是间接传递的。 C++ 中不存在 Delphi 字符串。常用类型为 PChar/LPWSTR。

Generell 有必要找出哪种语言将提供内存以及何时释放内存。调用何时离开范围? Delphi无法释放内存,必须调用C++后从内存中读取值。

在数组的情况下,您必须在之后通知 C++ 可以释放内存。另一种方法是传递一个回调方法。调用模块(Delphi)可以通过回调依次构建自己的数组。

Delphi 函数默认使用 register 生成。因此将函数原型切换到stdcall。

type TFunc = function(var arr: integer; NewCount: integer): boolean; stdcall;

第一个数组元素的地址来自参数。因此,增加读指针以读出下一个数组元素。

              var
                 Li     : integer;    
                 LpLfd  : PInteger;
                 //lplfd : PInteger absolute arr;
              begin
                SetLength(Result, NewCount);
                LpLfd := @arr; //instead of absolute 
                for Li := 0 to Pred(NewCount) do
                begin
                  Result[Li] := LpLfd^;
                  inc(LpLfd, 1);
               end;
             end; 

【讨论】:

"Delphi 函数默认使用 cdecl 生成。"不,默认是register @AndreasRejbrand 谢谢

以上是关于要从 Delphi 调用的 C++ dll 函数 - 数组参数的主要内容,如果未能解决你的问题,请参考以下文章

关于delphi调用C++的DLL中char*参数的问题

DELPHI调用DLL时的回调函数问题

如何使用 C++ 挂钩 Delphi 函数

Delphi调用C++编写的DLL

delphi如何调用dll函数

c ++指针将结构新数组指向delphi到DLL函数