COM DLL中创建一个线程来触发事件的问题
我利用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中创建一个线程来监视一个硬件状态,当状态改变时利用事件通知客户,不知应该如何在用户线程中来激发事件?请高手指点