要从 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 函数 - 数组参数的主要内容,如果未能解决你的问题,请参考以下文章