私はC#で書かれたdllを持っていて、COMに公開されています。ビルダーでdllを使用しています...クラスをインスタンス化できますが、C#メソッド呼び出しからの戻り値のマーシャリングに問題があります。
C#
public string GetValue([MarshalAs(UnmanagedType.LPWStr)] string key)
{
return "value";
}
ビルダーにインポートされたときの変換された関数:
virtual HRESULT STDMETHODCALLTYPE GetValue(LPWSTR key/*[in]*/,
BSTR* pRetVal/*[out,retval]*/) = 0;
私はC++についてほとんど知りません。'key'パラメーターは、パラメーターで' MarshalAs'属性を使用できるため、正常に渡されますが、戻り値として宣言する方法がわからないか、呼び出し方がわかりません。 C ++側で機能します(推測するだけで、いくつかのことを試しました)。
更新:さて、私はアントンの例を取り、ハンスのコメントに基づいて修正を試みることによって問題を解決することができました。Antonsの回答は彼が示すとおりに正確に機能しますが、メモリ管理の問題について懸念が表明されたため、C#でreturn属性を適用せず、C++コードは次のように関数を呼び出します。
BSTR result;
obj->GetValue(key, &result);
SysFreeString(key);
SysFreeString(result);
私はこれを手伝ってくれた両方の答えを信用できればいいのにと思います。どちらも私が必要な情報を提供するために必要でした。