2

这是通过 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 之间的通信很好。我需要更改什么才能使其正常工作?

4

1 回答 1

6

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

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

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

像这样称呼它:

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

At some point you may want to let the array length vary dynamically. As it stands the code assumes that the array has three elements. For more generality you would pass an extra parameter specifying the array length.

I'm assuming that the C++ function really is stdcall although nothing in the question makes that explicit.

于 2013-05-28T14:59:36.863 回答