2016-07-22 24 views
1

私はDelphiのDLLにC#から文字列のオープン配列を渡す必要があります。 delphiの配列の長さを設定し、C#に戻します。 これはどんな方法ですか?私はC#で、このコードをしようとしている最初の場合C#からDelphi dllに文字列配列を渡すにはどうすればよいですか?

public struct TStrSample 
{ 
    [MarshalAs(UnmanagedType.BStr)] 
    public string Name; 
} 

[DllImport(@"EPConvs.dll", CallingConvention = CallingConvention.StdCall)] 
public static extern void PopulateStrArray([In, Out] [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] TStrSample[] arr, 
              ref int len); 


[Microsoft.SqlServer.Server.SqlProcedure] 
public static void hcTable(SqlBytes blob) 
{ 
    TStrSample[] arr = new TStrSample[10]; 
    int len = arr.Length; 
    for (int i = 0; i < len; i++) 
    { 
     arr[i].Name = i.ToString(); 
    } 
    PopulateStrArray(arr, ref len); 
} 

デルファイ一部:

type 
    TStrSample = record 
    Name: WideString; 
    end; 
    PStrSample = ^TStrSample; 

procedure PopulateStrArray(arr: PStrSample; var len: Integer); stdcall; 
var 
    i: Integer; 
    returnArray: array of TStrSample; 
begin 
    returnArray := @arr; 
    for i := 0 to Len-1 do 
    returnArray[i].Name := 'YES = ' + IntToStr(i); 
end; 

しかし、それは動作しません。なにが問題ですか?

+0

あなたはDelphiの動的配列を渡すわけではありませんが、それはあなたのDelphiコードが想定しているものです。また、どのようにデータが流れますか。両方向で送信するように見えますが、両方の受信者が送信されたものを無視します。 –

+0

個人的には、配列要素にアクセスするためにポインタ演算を使用します。 Delphiのunsafe @演算子はあなたを助けません。型付きアドレスオプションを有効にします。次に、動的配列を削除します。ポインタ演算を使用してアクセスします。ああ、そこにはオープンアレイもありません。 –

+0

>個人的には、配列要素にアクセスするためにポインタ演算を使用します。 例を書く方法を教えてください。ありがとう。 – jckmalm

答えて

0

私はDelphiコードを変更しましたが、現在は動作しています。おかげでデビッドヘフナーナン

type 
    TStrSample = record 
    Name: WideString; 
    end; 
    PStrSample = ^TStrSample; 

procedure PopulateStrArray(arr: PStrSample; var len: Integer); stdcall; 
var 
    i: Integer; 
begin 
    for i := 0 to len - 1 do 
    begin 
    arr^.Name := 'YES = ' + IntToStr(i); 
    Inc(arr); 
    end; 
end; 

オープンアレイをDelphiに渡す可能性はありますか?

関連する問題