c# COM字符串在c++ BSTR中被损坏

C# COM string is corrupted in C++ BSTR

本文关键字:损坏 BSTR c++ COM 字符串      更新时间:2023-10-16

我写了一个c# COM对象,我从我的本地c++代码调用。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...
}
再次感谢你的帮助!!!!

"它在x64上工作"是一个强烈的暗示,你有一个调用约定不匹配。X64只有一个调用约定,而x86有几个。

确保您的事件处理程序声明为stdcall