描述:
我编写了一个进程外COM组件svr.exe。
在一个局域网内,我把svr.exe部署在我的计算机上。
又编写了一个客户程序callSvr.exe,部署在其他的计算机上。
现在,callsvr可以正常的访问到svr.exe中的方法。
接下来我需要给svr.exe添加事件回调,让它可以把事件通知给客户程序。
事件回调的方法是学习vckbase网站上的文章做的,其网址如下:
http://www.vckbase.com/document/viewdoc/?id=1525
我在svr.exe中定义了一个接口方法SetCBFun,客户程序可以调用此函数来设置“事件回调函数”。
在客户程序中,调用如下代码来设置回调函数的地址:
hr = pBackupAdmin->SetCBFun(&m_sink);
其中,m_sink是CSink m_sink对象变量。CSink是客户程序中自定义的一个类,它派生于ICallBack。而ICallBack是我在svr.exe中手工定义的一个接口,具体的代码我是参照vckbase网站提供的方法写的。
现在的问题是:我在调用pBackupAdmin->SetCBFun函数时出错,我跟踪调试进入SetCBFun函数中,进入了一个扩展名为tli的文件(是系统自动生成的)。在这个文件的SetCBFun函数中,当执行完HRESULT _hr = raw_SetCBFun(pCallBack)后,_hr等于0xc0000005。我用Error Lookup查找,也无法得知是什么错误,而继续执行下一条语句时就蹦异常了:
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
我也跟踪调试了vckbase网站的代码,而人家的代码就不出错,直接执行到COM组件服务的SetCBFun函数中了。我想,很可能是因为我的COM组件是远程调用的,在经过代理proxy.dll时出错了。是不是跨进程传输数据时哪里的数据没有兼容好啊?
请高手帮忙解释一下。多谢了。另外,我这里用的方法不是“事件连接点”的方法。难道必须使用“事件连接点”才可以?