描述:
写了一个COM组件,支持事件,在事件的参数列表中返回一个内部的COM对象, 也就是使用CComObject<type>::CreateInstance来创建的, 这个内部的对象支持IDispatch接口, 通过单步调试, 在VB.net中事件是可以被触发的, 但是参数对象总是Nothing,我的Fire_XXX(IDispatch* pDisp)函数是这样定义的, VB.net中事件是以这样的格式定义的:
对象变量名_事件名(ByVal 参数名 as Object) Handles 对象变量名.事件名, 请问有谁做过这方面的程序, 或者知道, 请指教,谢谢了.
解决方案1:
Fire_XXX不能在其它线程中调用,必须在组件线程中调用。网上有个atlcpimplmt的库,微软的人写的,可用于跨线程Fire事件,只有一个头文件,把你的组件类修改一下,原来是从IConnectionPointImpl派生的,改成从IConnectionPointImplMT派生即可。
解决方案2: 搞错你的意思了,我以为你是想让客户端返回一个组件给服务器。大致这样做:
CComObject<Cxxx>* obj = NULL;
CComObject<Cxxx>::CreateInstance(&obj);
obj->AddRef(); // 这句是必须的
Fire_SomeEvent((IDispatch*)obj);
obj->Release(); // 这句也是必须的
返回类型要用IDispatch** ppDisp,在IDL中要对该参数设置[out]属性。
事件方法中尽量避免使用返回接口的参数类型,因为事件可能被多个客户端接收,那么谁来负责返回呢?如果第一个接收者返回了一个指针,第二个接收者也要返回一个指针,那么第一个返回的组件就失去了减少引用计数的机会,组件可能永远不会释放。