Delphi を使用して dll (Delphi XE-3 で作成したもの) をロードし、C コードとのインターフェイスをとっています。私の問題は、配列が c 関数に渡されない理由を突き止めることです。そうでないのは、それらだけです。Delphi ファイル (簡略化) は次のようになります。
program CallcCode
uses
SysUtils, Windows,
DLLUnit in 'DLLUnit.pas'; // Header conversion
var
DLLHandle: cardinal;
n: Integer;
A: TArray<Integer>;
result1: Integer;
begin
// Initialize each Array
SetLength(A,n);
A[0] = ...;
// Load the DLL (and confirm its loaded)
DLLhandle := LoadLibrary('dllname.dll');
if DLLhandle <> 0 then
begin
result1 := dll_func1(n,A); // A and B are not passed correctly
end
FreeLibrary(DLLHandle);
end.
初めて dll_func1 の「トレース」に成功し、DLLUnit に入りました。
const
nameofDLL = 'dllname';
function dll_func1(n: Integer; A: TArray<Integer>): Integer; cdecl; external nameofDLL;
再び「トレースイン」すると、c ファイルに到達します。このファイルには、まだ正しい n 値と DLLdefs 値が含まれていますが、A (「ローカル変数」見出しの下) は次のようになっています。
[-] A :(Aplha-Numeric)
..[0] 0 (0x00000000)
他の関数呼び出しが正常に機能し、問題なく dll_func1.c ファイルにトレースできるため、少なくとも DLL に (できれば) 正しくアクセスしていることはわかっています。関数を次のように変更してみました
function dll_func1(n: Integer; A: PInteger): Integer; cdecl; external nameofDLL;
...
result1 := dll_func1(n,PInteger(A))
また
function dll_func1(n: Integer; A: PInteger): Integer; cdecl; external nameofDLL;
...
result1 := dll_func1(n,@A[0])
(TArray と整数または A の配列の両方を使用) しかし、変更はありません。これは、私が見ていない問題に関連していると信じています。全体がコンパイルされて実行されますが、TArray の失敗により、result1 は正しくありません。何がうまくいかないのかについてのアイデアはありますか?
EDIT Cの関数は次のとおりです。
int dll_func1(int n, int A [])