2

この場合、IntPtr を使用することを学びました。

-delphi (デルファイ 2006 バージョン) コード

 function GetRequestResult(out code:integer):PChar; stdcall;
   begin
    LogMessage('GetRequestResult');
    code:=requestCode;
    result:=PChar(RequestResult);
    LogMessage('GetRequestResult done');
   end;

次に、C#で使用するために、次のように使用しました

IntPtr str = GetRequestResult(out code); 
string loginResult = Marshal.PtrToStringAnsi(str); 

これはうまくいきます。

では、このケースはどうでしょうか。

-デルファイ コード

 procedure Login(login,password:PChar); stdcall;
...
...

この PChar は () 内にあります。では、その Login delphi 関数に文字列値を渡す正確な方法は何ですか?

[DllImport ("ServerTool")]

  1. private static extern void Login([MarshalAs(UnmanagedType.LPStr)]string id, [MarshalAs(UnmanagedType.LPStr)]string pass);

  2. private static extern void Login(IntPtr id, IntPtr pass); // この場合、この IntPtr を後半でどのように使用しますか?

  3. private static extern void Login(string id, string pass);

前もって感謝します。

4

2 に答える 2

3

オプション 3 は、これを行う正しい方法です。p/invoke マーシャラーは、C# 文字列を null で終了する文字配列、つまり PChar へのポインターにマップします。デフォルトの呼び出し規約は stdcall で、デフォルトの文字セットは Ansi なので、それらを指定する必要はありません。

オプション1も機能しますが、デフォルトのマーシャリングを再記述しているだけなので、不必要に冗長です。オプション 2 も機能する可能性がありますが、自分で余分な作業を作成するだけです。ネイティブ関数呼び出しが返されたら、IntPtr 値を解放する責任があります。

于 2012-08-13T11:57:43.417 に答える
1

使用できます: Marshal.StringToHGlobalAnsi。http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtohglobalansi.aspx

于 2012-08-12T13:00:48.550 に答える