C#COM字符串在C ++ BSTR中已损坏

时间:2013-06-13 17:52:14

标签: c# c++ com

我编写了一个C#COM对象,我从我的本机C ++代码中调用它。 C#COM有一些功能和事件。

我在C ++中注册了事件,并调用了C#对象。 在某些时候,事件被调用,将C#字符串作为参数发送到C ++ BSTR,该文件已损坏。

我尝试了所有我能想到的东西,并且看了一遍: - (

有没有人知道为什么BSTR被破坏了???

编辑: 重要信息:

  1. 它适用于x64位,错误仅在x86版本上发生。
  2. C#COM编译为任何CPU。我尝试将其编译为x86,但它没有任何区别。
  3. 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...
    }
    

    再次感谢您的帮助!!!!

1 个答案:

答案 0 :(得分:2)

“它适用于x64”强烈提示你有一个调用约定不匹配。 x64只有一个调用约定,但x86有几个。

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