【发布时间】:2019-03-20 01:27:05
【问题描述】:
我有一个 COM 服务器,用 C# 完成,其中一个方法采用回调函数。
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class REDIServer
{
public bool Connect([MarshalAs(UnmanagedType.FunctionPtr)] ref CallBackFunction callback)
{
// send callback deeper into C# code
return _service.Connect(callback);
}
当我从那个 dll 生成 tlb 代码以便我可以在我的 C++ 客户端中使用它时,它看起来像这样:
virtual HRESULT __stdcall Connect (
/*[in,out]*/ long * callback,
/*[out,retval]*/ VARIANT_BOOL * pRetVal ) = 0;
最后,当我尝试使用 C++ 中的 Connect() 调用时,我是这样使用它的:
void Callback()
{
cout << "got a callback\n";
}
int main()
{
HRESULT hr = CoInitialize(NULL);
try
{
REDIXLServer::_REDIServerPtr ptr(__uuidof(REDIXLServer::REDIServer));
VARIANT_BOOL ret;
hr = ptr->Connect((long *) &Callback, &ret);
}
catch (_com_error & e)
{
cout << e.ErrorMessage() << endl;
}
程序在调用 Conect() 时崩溃。我收到一个消息框“托管调试助手 'InvalidFunctionPointerInDelegate 检测到问题......无效的函数指针已传递到运行时以转换为委托......”
那我做错了什么?谢谢
【问题讨论】:
标签: c# visual-c++ com