程序中在一个新的线程中使用new方法创建一个COM对象,线程终止后,对象并没有销毁,主线程继续等待其它用户的请求,并监控事件。但是,程序可以操作对象的属性与方法,却永远接收不到COM的任何事件。又如果,程序是在主线程中使用new方法创建COM对象,则可以接收到事件!不知怎么回事?我使用接收事件的机制是使用CComObjectRoot的方法的。如:
class CMyCom :
public CComObjectRoot,
public IDispEventImpl__IMyEvents,
public IUnknown

解决方案 »

  1.   

    接受器?是接在哪里调用DispEventAdvise方法吗?是在创建的线程中调用的。
      

  2.   

    那么DispEventAdvise的对象是在哪儿创建的??
      

  3.   

    那么DispEventAdvise的对象是在哪儿创建的??
    ------
    DispEventAdvise是方法吧?
    HRESULT SubScribe(HWND hWnd)
    {
    m_hWndParent = hWnd;
    IUnknownPtr pUnk(this);
    pUnk->AddRef();
    return IDispEventImpl__IMyEvents::DispEventAdvise(m_pMy, &__uuidof (_IMyEvents));
    }
      

  4.   

    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 永远不会执行。如果是在主线程中,就可以。
      

  5.   

    从你的例子来看CMyCom是你的接收器,m_pIZKEM应该是你要接获事件的对象的接口,CMyCom所在线程退出后没法处理消息自然也响应不了事件
      

  6.   

    感觉是你把对象和对象的接收器写到一起了,很怪?!
    对,我看网上好多例子都是这样写的。从你的例子来看CMyCom是你的接收器,m_pIZKEM应该是你要接获事件的对象的接口,CMyCom所在线程退出后没法处理消息自然也响应不了事件
    为什么线程退出后就响应不了事件呢?线程退出后,CComZkem对象并没有销毁呀~!
      

  7.   

    com原理和应用 相关内容讲的还是比较清楚的
      

  8.   

    goodboyws(深夜不眠者) :
    能否大致给我讲一讲呢?谢谢!
      

  9.   

    COM中多线程事件问题,我给你的地址,保证你解决,不过分要全给我吧!
    http://support.microsoft.com/kb/q280512/#kb1