COM事件,多线程问题?

午秋 2005-09-21 05:34:35
程序中在一个新的线程中使用new方法创建一个COM对象,线程终止后,对象并没有销毁,主线程继续等待其它用户的请求,并监控事件。但是,程序可以操作对象的属性与方法,却永远接收不到COM的任何事件。

又如果,程序是在主线程中使用new方法创建COM对象,则可以接收到事件!不知怎么回事?

我使用接收事件的机制是使用CComObjectRoot的方法的。如:
class CMyCom :
public CComObjectRoot,
public IDispEventImpl__IMyEvents,
public IUnknown
...全文
254 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
runi 2005-12-02
  • 打赏
  • 举报
回复
我也有,如何启用多线程呢?
weiym 2005-11-04
  • 打赏
  • 举报
回复
up ,我也有这方面的问题
loveghb 2005-11-03
  • 打赏
  • 举报
回复
楼上的好贪心啊。哈哈。
打个记号!
feelmoon 2005-09-22
  • 打赏
  • 举报
回复
COM中多线程事件问题,我给你的地址,保证你解决,不过分要全给我吧!
http://support.microsoft.com/kb/q280512/#kb1
午秋 2005-09-22
  • 打赏
  • 举报
回复
goodboyws(深夜不眠者) :
能否大致给我讲一讲呢?谢谢!
goodboyws 2005-09-22
  • 打赏
  • 举报
回复
com原理和应用 相关内容讲的还是比较清楚的
午秋 2005-09-22
  • 打赏
  • 举报
回复
感觉是你把对象和对象的接收器写到一起了,很怪?!
对,我看网上好多例子都是这样写的。

从你的例子来看CMyCom是你的接收器,m_pIZKEM应该是你要接获事件的对象的接口,CMyCom所在线程退出后没法处理消息自然也响应不了事件
为什么线程退出后就响应不了事件呢?线程退出后,CComZkem对象并没有销毁呀~!
goodboyws 2005-09-21
  • 打赏
  • 举报
回复
从你的例子来看CMyCom是你的接收器,m_pIZKEM应该是你要接获事件的对象的接口,CMyCom所在线程退出后没法处理消息自然也响应不了事件
goodboyws 2005-09-21
  • 打赏
  • 举报
回复
感觉是你把对象和对象的接收器写到一起了,很怪?!
午秋 2005-09-21
  • 打赏
  • 举报
回复
class CComZkem;
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 永远不会执行。如果是在主线程中,就可以。
午秋 2005-09-21
  • 打赏
  • 举报
回复
那么DispEventAdvise的对象是在哪儿创建的??
------
DispEventAdvise是方法吧?
HRESULT SubScribe(HWND hWnd)
{
m_hWndParent = hWnd;
IUnknownPtr pUnk(this);
pUnk->AddRef();
return IDispEventImpl__IMyEvents::DispEventAdvise(m_pMy, &__uuidof (_IMyEvents));
}
goodboyws 2005-09-21
  • 打赏
  • 举报
回复
那么DispEventAdvise的对象是在哪儿创建的??
午秋 2005-09-21
  • 打赏
  • 举报
回复
接受器?是接在哪里调用DispEventAdvise方法吗?是在创建的线程中调用的。
goodboyws 2005-09-21
  • 打赏
  • 举报
回复
你的接受器是那里创建的

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧