2012-03-14 13 views
2

レコードの配列をdll(delphi)に渡すことはできますか? 「私ができるレコードの配列をdelphi dllに渡す

function getNotes(var someRecord: TArrOfMyRecord):boolean; stdcall; 
begin 
    someRecord[1].tgl:= now; 
    someRecord[1].notes:= 'percobaan'; 

    someRecord[2].tgl:= now + 1; 
    someRecord[2].notes:= 'percobaan1'; 

    return:= true; 
end; 

は私が入れたレコードを持っている共有DLL内でDelphiのユニット

TmyRecord = record 
    tgl : Double; 
    notes: shortstring; 
end 

TarrOfMyRecord = array[1..1000] of TmyRecord 

(DLLとメインのアプリケーションで使用される)、私は機能を持っていますdllによって返されたsomeRecordの正しい値を得る。

おかげ

UPDATE: これは、メインアプリケーションでは私のコードです:

interface 

function getNotes(var someRecord: TArrOfMyRecord):boolean; stdcall; external 'some.dll' 

implementation 

procedure somefunction; 
var myRecord: TarrOfMyRecord; 
    i: integer; 
begin 
    if getNotes(myRecord) then 
     for i:= 1 to 1000 do memo1.lines.add(myRecord[i].notes); 

end; 
+0

は、DLLを呼び出すコードを表示します。また、現在のアプローチでは、DLLのすべてのユーザーがDelphiで作成されることを約束していますか?あなたはそれに満足していますか? –

+0

@DavidHeffernan:はい..私はそれを認識しており、大丈夫です。 – abanas

+0

関数はgetNotes(var someRecord:TArrOfMyRecord)として定義しますが、変数myRecord:TmyRecordを渡しますか?これはTypoですか? – Justmade

答えて

0

DLLに大量のデータを渡すための最良の方法は、ポインタを使用しています。

レコード定義:

... 
TarrOfMyRecord = array[1..1000] of TmyRecord 
ParrOfMyRecord = ^TarrOfMyRecord; 

DLL:

function getNotes(someRecord: PArrOfMyRecord):boolean; stdcall; 
begin 
    someRecord^[1].tgl:= now; 
... 

プログラム:

... 
begin 
    if getNotes(@myRecord) then 
     for i:= 1 to 1000 do memo1.lines.add(myRecord[i].notes); 
... 
+0

このようにして、私は唯一のDelphiアプリケーションを使うことができますか、DLLを他の言語で呼び出すことができますか? – Martin

+0

@Martinこの方法は、どのプログラミング言語で作成されたプログラムでも使用できます。一部のWindows API関数もこのメソッドを使用します。 – Vahid

+0

私はあなたのコードを使用しようとすると、 "関数がいくつかのパラメータを持っていなければならない"ため "getNotes(@myRecord)"にエラーが発生します... – Martin

関連する問題