描述:
我利用ATL WIZARD创建了一个COM DLL,然后创建一个线程来出发事件,可在COM SERVER中一调用事件,就XP就报异常,客户退出,不知是什么原因?
DWORD WINAPI QueryThreadProc(LPVOID lpParameter)
{
HRESULT hr=CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(FAILED(hr))
OutputDebugString("CoInitializeEx Fail");
CBox* p=(CBox*)lpParameter;
while (WaitForSingleObject(p->m_hEvent, 0) != WAIT_OBJECT_0)
{
p->Fire_OnQueryMinData(1,1);//这句激发事件调用会报错,VB客户异常退出
}
CoUninitialize();
return(0);
}
为了不列集接口,我将套间改为了自由套间
即将stdafx.h中的#define _ATL_APARTMENT_THREADED改为#define _ATL_FREE_THREADED,同时将COM对象的派生基类从CComObjectRootEx<CComSingleThreadModel>改为CComObjectRoot,但这些都不能解决问题,
class ATL_NO_VTABLE CBox :
public CComObjectRoot,//CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CBox, &CLSID_Box>,
public ISupportErrorInfo,。。。。
不知是不是在DLL中不支持MTA,我的客户是VB开发的,是不是VB不支持MTA SERVER。
我需要在COM SERVER中创建一个线程来监视一个硬件状态,当状态改变时利用事件通知客户,不知应该如何在用户线程中来激发事件?请高手指点
解决方案1:
看起来, 你的的控件主线程没有消息汞。还有, 我假设你在主线程激发事件不会引起VB出错。
如果是MFC写的控件, 解决办法就很简单, 你的工作者线程不要p->Fire_OnQueryMinData(1,1);而是PostMessage()一个自定义消息给主线程的消息汞, 由主线程去FireOn。
现在你是在ATL中。有朋友说过, 可以在ATL实现一个隐藏的窗口,利用其消息汞接收工作者线程发来的要求激发事件。他说他试过是可以的。我还未有时间作试验。楼主不妨一试。