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 オープン配列は、実際には 2 つのパラメータを使用して渡されます。最初の要素のアドレスと、要素数から 1 を引いたものです。

C++ 関数を呼び出すために、オープン配列を使用することはできません。最初の要素へのポインターを受け取る関数を宣言するだけです。

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

次のように呼び出します。

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

ある時点で、配列の長さを動的に変化させたい場合があります。現状では、コードは配列に 3 つの要素があると想定しています。より一般的にするには、配列の長さを指定する追加のパラメーターを渡します。

C++ 関数は実際には stdcall であると想定していますが、問題にはそれを明示するものは何もありません。

于 2013-05-28T14:59:36.863 に答える