在纯C ++中需要有关COM中事件的帮助!

时间:2010-06-07 22:38:25

标签: c++ events com import

家伙!非常重要的问题:

请看my project (300Kb)。我不能使用MFC / ATL,只能使用纯C ++。

我有COM库(niapi.dll),但没有可用的源/标头,仅限dll。

有连接服务器的类(NiApi :: SrvrSession),类有登录事件处理程序(NiApi :: SrvrSession :: OnLogin)。

我用过

#import "NiApi.dll"

生成包装器/信息,

然后

ISrvrSessionPtr session(L"NiApi.SrvrSession");

创建对象,然后尝试

session->put_OnLogin();

分配事件,但没有一个put_On或这样的成员。

niapi.tlh里面有_ISrvrSessionEvents结构,但它与SrvrSession没有任何关系。

我需要使用来自NiApi :: SrvrSession的事件来处理连接状态。

请帮助或我的老板杀了我! (抱歉英语不好,我读得比说话好;)

3 个答案:

答案 0 :(得分:2)

COM事件通过连接点处理。您需要编写自己的COM对象来实现您感兴趣的任何事件接口。然后,您需要将其连接到触发事件的COM对象。首先,为其IConnectionPointContainer确定COM对象,然后找到事件接口的GUID的相应连接点。您调用其Advise方法将其连接到事件接收器。

class CSrvrSessionEvents: public _ISrvrSessionEvents
{
public:
    HRESULT OnLogin(long LoginResult)
    {
        // do something
        return S_OK;
    }
    // implement rest of _ISrvrSessionEvents
};

ISrvrSession* pSrvrSession = ...; // get ISrvrSession from somewhere
_ISrvrSessionEvents* pSrvrSessionEvents = new CSrvrSessionEvents();
IConnectionPointContainer* pCPC = NULL;
pSrvrSession->QueryInterface(IID_IConnectionPointContainer, &pCPC);
IConnectionPoint* pCP = NULL;
pCPC->FindConnectionPoint(__uuidof(_ISrvrSessionEvents), &pCP);
DWORD dwCookie = 0;
pCP->Advise(pSrvrSessionEvents, &dwCookie);
pSrvrSession->Connect(); // I assume this fires some events
pCP->Unadvise(dwCookie);

答案 1 :(得分:1)

真正需要的是仔细阅读 codeproject_TEventHandler

这里都解释了。

答案 2 :(得分:0)

put_前缀为the default prefix for the raw interface (customizable via the raw_property_prefixes attribute)。由于您没有使用原始界面,请使用session-> OnLogin = ...代替。

有关事件处理的信息,请参阅ADO Events Model Example (VC++)