通过引用将数组从Delphi 7传递到C++;动态链接库 这里是通过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 7传递到C++;动态链接库 这里是通过DLL公开的C++函数: double my_exposed_cpp_function(int* my_array){ int i = my_array[2]; /* i should be 3 */ my_array[2]++; return 0; },c++,delphi,dll,delphi-7,parameter-passing,C++,Delphi,Dll,Delphi 7,Parameter Passing,下面是我的Delphi函数的声明 function dll_function(var my_array: array of integer): Real; stdcall; external myDLL name 'my_exposed_cpp_function'; procedure talk_to_dll(); var return_value: Real; my_array: array[0..2] of integer; final_value: integer; begin

下面是我的Delphi函数的声明

function dll_function(var my_array: array of integer): Real; stdcall; external myDLL name 'my_exposed_cpp_function';
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函数中执行的操作

function dll_function(var my_array: array of integer): Real; stdcall; external myDLL name 'my_exposed_cpp_function';
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,虽然问题中没有任何东西使它显式。

处理戴维,谢谢。我在你的编辑之前工作,也注意到C++的代码是没有意义的,因为我使用了++操作符。我已经编辑了这个例子:)现在我不需要动态地改变事情,但我会在将来记住这一点。