0

ネイティブ C++ コードから呼び出す C# COM オブジェクトを作成しました。C# COM には、いくつかの関数とイベントがあります。

C++ でイベントに登録し、C# オブジェクトを呼び出しました。ある時点でイベントが呼び出され、C# 文字列がパラメーターとして C++ BSTR に送信されますが、これは破損しています。

私は考えられるすべてを試し、すべてを見ました:-(

BSTRが破損している理由を知っている人はいますか???

編集: 重要な情報:

  1. x64 ビットで動作しますが、エラーは x86 バージョンでのみ発生します。
  2. 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...
}

繰り返しますが、あなたの助けに感謝します!!!!

4

1 に答える 1