首页 > 解决方案 > 要从 Delphi 调用的 C++ dll 函数 - 数组参数

问题描述

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

标签: c++arraysc++11delphidll

解决方案


数组没有给出其元素的数量。因此,必须在另一个参数/路由中提供该编号。

字符串是指针。因此,该值是间接传递的。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; 

推荐阅读