程序中在一个新的线程中使用new方法创建一个COM对象,线程终止后,对象并没有销毁,主线程继续等待其它用户的请求,并监控事件。但是,程序可以操作对象的属性与方法,却永远接收不到COM的任何事件。又如果,程序是在主线程中使用new方法创建COM对象,则可以接收到事件!不知怎么回事?我使用接收事件的机制是使用CComObjectRoot的方法的。如:
class CMyCom :
public CComObjectRoot,
public IDispEventImpl__IMyEvents,
public IUnknown
class CMyCom :
public CComObjectRoot,
public IDispEventImpl__IMyEvents,
public IUnknown
------
DispEventAdvise是方法吧?
HRESULT SubScribe(HWND hWnd)
{
m_hWndParent = hWnd;
IUnknownPtr pUnk(this);
pUnk->AddRef();
return IDispEventImpl__IMyEvents::DispEventAdvise(m_pMy, &__uuidof (_IMyEvents));
}
typedef IDispEventSimpleImpl<ID_ZKEM, CComZkem, &__uuidof(_IZKEMEvents)> IDispEventImpl__IZKEMEvents ;class CComZkem :
public CComObjectRoot,
public IDispEventImpl__IZKEMEvents,
public IUnknown
{
public:
CComBSTR m_ItemName;
CComBSTR m_IPAddress;
private:
HWND m_hWndParent;
IZKEMPtr m_pIZKEM;
LONG m_macNum;
BOOL m_connected;
private:
HRESULT __stdcall OnAttTransaction ()
{
// 这就是事件
return S_OK;
}
public:
CComZkem(void);
~CComZkem(void);
HRESULT SubScribe(HWND hWnd)
{
m_hWndParent = hWnd;
IUnknownPtr pUnk(this);
pUnk->AddRef();
return IDispEventImpl__IZKEMEvents::DispEventAdvise(m_pIZKEM, &__uuidof (_IZKEMEvents));
} HRESULT UnSubScribe(void)
{
return IDispEventImpl__IZKEMEvents::DispEventUnadvise(m_pIZKEM, &__uuidof (_IZKEMEvents));
}
public:
BEGIN_COM_MAP(CComZkem)
COM_INTERFACE_ENTRY(IUnknown)
END_COM_MAP() BEGIN_SINK_MAP(CComZkem)
SINK_ENTRY_INFO(ID_ZKEM, __uuidof(_IZKEMEvents), 1, OnAttTransaction, &OnInfoLONG10)
END_SINK_MAP()
};==
我在新的线程中用new CComZkem创建了实例,然后调用SubScribe方法。结果OnAttTransaction 永远不会执行。如果是在主线程中,就可以。
对,我看网上好多例子都是这样写的。从你的例子来看CMyCom是你的接收器,m_pIZKEM应该是你要接获事件的对象的接口,CMyCom所在线程退出后没法处理消息自然也响应不了事件
为什么线程退出后就响应不了事件呢?线程退出后,CComZkem对象并没有销毁呀~!
能否大致给我讲一讲呢?谢谢!
http://support.microsoft.com/kb/q280512/#kb1