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;
しかし、それは動作しません。なにが問題ですか?
あなたはDelphiの動的配列を渡すわけではありませんが、それはあなたのDelphiコードが想定しているものです。また、どのようにデータが流れますか。両方向で送信するように見えますが、両方の受信者が送信されたものを無視します。 –
個人的には、配列要素にアクセスするためにポインタ演算を使用します。 Delphiのunsafe @演算子はあなたを助けません。型付きアドレスオプションを有効にします。次に、動的配列を削除します。ポインタ演算を使用してアクセスします。ああ、そこにはオープンアレイもありません。 –
>個人的には、配列要素にアクセスするためにポインタ演算を使用します。 例を書く方法を教えてください。ありがとう。 – jckmalm