2

C# コードを書いていますが、アンマネージ C++ ライブラリを呼び出す必要があるコードがあります。

ライブラリのヘッダーにある署名はこのようなものです

bool GetValueFromFile(char* sPathToFile, char* &sResult);

これを C# で翻訳する必要がある署名は何ですか? 私は試した:

bool GetValueFromFile(string filePath, ref string result)

しかし、うまくいきません。例外はなく、戻り値は true です。ただし、文字列の結果は null のままです。out string resultまたはについても同様ですStringBuilder result

Marshal.GetDelegateForFunctionPointer を使用して、関数ポインターをデリゲートとして取得します。

4

2 に答える 2

4

ポインターへの参照は、少なくとも P/Invoke に関する限り、ポインターへのポインターとほとんど同じように処理できます。

パラメータには、またはとともにanIntPtrを使用する必要があると思いますが、C/C++ 関数が文字列メモリを割り当てるかどうかを知らずに言うのは少し難しいです。sResultMarshal.PtrToStringAnsi()Marshal.PtrToStringAuto()

それが機能する場合は、おそらく (文字列を取得したMarshal.FreeCoTaskMem()に) orを使用してメモリを解放する必要がありますがMarshal.FreeHGlobal()、これもまた、C/C++ 関数が何をするかを知らずに確実に知ることは不可能です。

注: を使用しIntPtrて出力値を取得する場合は、out resultまたはを使用する必要がありますref result

于 2013-06-25T07:52:13.627 に答える