通过引用从Delphi 7传递数组到c++ Dll

Pass array by reference from Delphi 7 to C++ Dll

本文关键字:数组 c++ Dll 引用 Delphi      更新时间:2023-10-16

下面是通过DLL公开的c++函数:

double my_exposed_cpp_function(int* my_array){
 int i = my_array[2]; /* i should be 3 */
 my_array[2]++;
 return 0;
}
下面是Delphi函数 的声明
function dll_function(var my_array: array of integer): Real; stdcall; external myDLL name 'my_exposed_cpp_function';

下面是我想在Delphi函数

中做的事情
procedure talk_to_dll();
var
 return_value: Real;
 my_array: array[0..2] of integer;
 final_value: integer;
begin
 my_array[0] = 1;
 my_array[1] = 2;
 my_array[2] = 3;
 return_value := dll_function(my_array);
 final_value = my_array[2]; /* my_array[2] should now be 4 */
end;

希望这个例子让我的意图清楚。我可以使用这种设置来处理更简单的数据类型,这样我就知道Delphi和dll之间的通信是好的。我需要做什么改变才能让它工作?

Delphi开放数组实际上使用两个参数传递:第一个元素的地址和元素计数减1。

调用c++函数不能使用开放数组。只需将函数声明为接收指向第一个元素的指针:

function dll_function(my_array: PInteger): Real; stdcall; 
    external myDLL name 'my_exposed_cpp_function';

这样写:

return_value := dll_function(@my_array[0]);  

在某些情况下,您可能希望让数组长度动态变化。目前,代码假设数组有三个元素。为了更通用,你可以传递一个额外的参数来指定数组的长度。

我假设c++函数确实是stdcall,尽管问题中没有明确说明这一点。