ネイティブ C++ コードから呼び出す C# COM オブジェクトを作成しました。C# COM には、いくつかの関数とイベントがあります。
C++ でイベントに登録し、C# オブジェクトを呼び出しました。ある時点でイベントが呼び出され、C# 文字列がパラメーターとして C++ BSTR に送信されますが、これは破損しています。
私は考えられるすべてを試し、すべてを見ました:-(
BSTRが破損している理由を知っている人はいますか???
編集: 重要な情報:
- x64 ビットで動作しますが、エラーは x86 バージョンでのみ発生します。
- C# COM は ANY CPU としてコンパイルされます。x86としてコンパイルしようとしましたが、違いはありませんでした。
イベントを呼び出す CS コード:
// declaring the event and delegate
public delegate void on_start_delegate(string dict_param);
public event on_start_delegate on_start_click;
void on_start(mydictionary dictparams)
{
string strparams = dictparams.ToString();
Trace.WriteLine(strparams); // the string is fine
if (on_start_click != null)
on_start_click(strparams); // <--- Calling C++
}
接続ポイント クラス:
[Guid("0581E......")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface Iregistration_form_events
{
[DispId(1)]
void on_start_click(string dict_param);
}
C++ では、イベントに登録します。
BEGIN_SINK_MAP(registraion_form)
SINK_ENTRY_INFO(SENSOR_REG_SINK_ID, __uuidof(namespace::Iregistration_form_events), 1, on_start_click, &on_start_click_info)
END_SINK_MAP()
_ATL_FUNC_INFO registraion_form::on_start_click_info = {CC_STDCALL, VT_EMPTY, 1, {VT_BSTR}};
BSTR が破損する関数:
void registration_form::on_start_click( BSTR params ) // <-- params get corrupted!
{
dictionary dictparams;
std::wstringstream ss;
ss << params;
ss >> dictparams;
// do more stuff...
}
繰り返しますが、あなたの助けに感謝します!!!!