次のシグネチャを持つ C++ 関数があります
TCHAR *DXGetErrorDescription9(HRESULT hr);
私は持っている
[DllImport("dxerr9.dll",EntryPoint="GetDXErrorString9")]
static public extern string GetDXErrorString9(int DXError);
文字列を TCHAR* にマーシャリングするにはどうすればよいですか? ありがとう
少し調べてみると、directx エラー ルーチンは dll として出荷されているのではなく、実行可能ファイルに静的にリンクするライブラリとして出荷されていることがわかりました。これは、dxerr9.lib のサイズに基づいて計算する必要がありました (5M で、他のスタブ ライブラリよりもはるかに大きい)。
したがって、これを機能させるために、次のことを行いました。
Win32 プロジェクトを作成することにより、Visual Studio でこれを行うことができます (アプリケーションの設定を変更して、それが dll になり、シンボルをエクスポートするようにします)。私は最小を「DirectXErrWrapper」と呼びました。
ラッパー プロジェクト内に、DXGetErrorDescription のパススルーを追加します。私は私のDXGetErrDescPassThrough()を呼び出しました:
extern "C" {
DIRECTXERRWRAPPER_API TCHAR * DXGetErrDescPassThrough(HRESULT hr)
{
return (TCHAR *)DXGetErrorDescription(hr);
}
}
extern "C" ブロックは重要です (C++ 名のデマングリングに関係しています)。このプロジェクトには #include "dxerr.h" が必要であり、dxerr.lib を静的にリンクする必要があるため、directx sdk インクルード dir をインクルード パスに追加し、directx sdk lib dir を lib パスに追加する必要があります。
次に、マネージ コードにラッパー dll からの呼び出しをインポートさせます。
[DllImport("DirectXErrWrapper.dll", CharSet=CharSet.Unicode)]
static public extern string DXGetErrDescPassThrough(int DXError);
2005 年のネイティブ プロジェクトではデフォルトで Unicode が使用されるため、DllImport で Unicode を指定する必要がありました。最後に、次の方法でマネージ コードから呼び出します。
Debug.WriteLine("DXGettErrDescPassThrough=" + DXGetErrDescPassThrough(0));
この場合、呼び出しは「関数が正常に完了しました」をデバッグ デバイスに出力します。これは 0 が成功であるためです。
(前の投稿に続きます)
それはDirectX関数の1つのように見えます(C#AFAIKではなくC ++)。Unicode および ANSI バージョンが付属していると確信しています。Unicode でコンパイルすると、TCHAR は unicode にマップされます (T は型のニーモニックです。Unicode では Unicode、mbcs ではマルチバイト文字セット、それ以外の場合は ansi です)。通常は CharSet=CharSet.Auto を使用できますが、それによって互換性の問題が発生する場合 (たとえば、既に移植した構造体に ansi 文字列が必要なため、ansi 文字列を使用する必要がある場合) は、プロジェクトと一致するものを使用できます (Charset または.Unicode (すべて Unicode または Charset.Ansi の場合)、C# 文字列にマーシャリングしても問題はありません。戻り値が暗黙的に OUT になる場合がありますが、[OUT] として装飾する必要がある場合があります。私も、DirectX が標準の [out, retval] 規則に従って TLB と共に出荷されることを望みます!