2

ネイティブコードのサンプル関数があります

HRESULT getSampleFunctionValue(_Out_ LPWSTR * argument)

この関数は、引数の値を出力します。マネージド コードから呼び出す必要があります

[DllImport("MyDLL.dll", EntryPoint = "getSampleFunctionValue", CharSet = CharSet.Unicode)]
static extern uint getSampleFunctionValue([MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder  argument);

これはガベージ値を返します。私の知る限り、元の C 関数は CoTaskMemAlloc を使用して文字列を作成しません。正しい呼び方は?

どんな助けでも大歓迎です。

4

1 に答える 1

4

ポインターを受け取るには C# コードが必要です。このような:

[DllImport("MyDLL.dll")]
static extern uint getSampleFunctionValue(out IntPtr argument);

次のように呼び出します。

IntPtr argument;
uint retval = getSampleFunctionValue(out argument);
// add a check of retval here
string argstr = Marshal.PtrToStringUni(argument);

また、おそらく、割り当てたメモリの割り当てを解除するネイティブ関数を呼び出す必要があります。Marshal.PtrToStringUni への呼び出しの直後にこれを行うことができます。その時点でポインターは不要になるからです。または、返される文字列が静的に割り当てられている可能性があります。いずれにせよ、ネイティブ ライブラリのドキュメントで何が必要かが説明されています。

呼び出し規約を指定する必要がある場合もあります。書かれているように、ネイティブ関数は を使用するように見えます__cdecl__stdcallただし、質問にの仕様が含まれていない可能性があります。ここでも、ネイティブ ヘッダー ファイルを確認して確認してください。

于 2013-08-08T06:54:28.447 に答える