家伙!非常重要的问题:
请看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的事件来处理连接状态。
请帮助或我的老板杀了我! (抱歉英语不好,我读得比说话好;)
答案 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++)