我编写了一个C#COM对象,我从我的本机C ++代码中调用它。 C#COM有一些功能和事件。
我在C ++中注册了事件,并调用了C#对象。 在某些时候,事件被调用,将C#字符串作为参数发送到C ++ BSTR,该文件已损坏。
我尝试了所有我能想到的东西,并且看了一遍: - (
有没有人知道为什么BSTR被破坏了???
编辑: 重要信息:
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...
}
再次感谢您的帮助!!!!
答案 0 :(得分:2)
“它适用于x64”强烈提示你有一个调用约定不匹配。 x64只有一个调用约定,但x86有几个。
确保您的事件处理程序声明为stdcall。