我正在查看 MSDN 文档,上面说我可以 CoCreateInstance a SENS object using its CLSID 。但是,尚不清楚 __uuidof(SENS) 是否意味着什么 - 因为它只是 Sensevts.h 文件中的前向声明。此外,SENS 类仅提供“传出”接口(interface),并且被标记为“不可创建”(通过 MS Com Viewer 查看),这让我不知道如何引用 SENS 对象本身的实例。
这与获取 instance of IShellLink 的示例代码形成对比:
HRESULT hr;
IShellLink* pISL;
hr = CoCreateInstance ( CLSID_ShellLink, // CLSID of coclass
NULL, // not used - aggregation
CLSCTX_INPROC_SERVER, // type of server
IID_IShellLink, // IID of interface
(void**) &pISL ); // Pointer to our interface pointer
这里 ShellLink 被称为“IShellLink”。很公平。但是我应该使用什么类型(除了 void*)来接收 SENS 的实例?除了 CLSID 问题之外,我打算用于 SENS 的 IID 又如何呢?最终我想使用 SENS 的 IID_ISensLogon 接口(interface),但因为它是一个传出接口(interface),所以我无法想象在这里使用它是否有意义。大概我需要与 SENS 的 IConnectionPointContainer
接口(interface)通信(它肯定实现了这一点,对吧?),以便我可以访问 ISensLogon。
简而言之,有人可以向我展示示例代码是什么样子,以便我可以调用“Advise()”并开始从 SENS 接收事件吗?
更新我正在取得一些进展,所以我的代码现在看起来像这样:
#import <es.dll>
#include <EventSys.h>
using namespace EventSystemLib;
//...
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
do {
IEventSystemPtr evSystem;
HRESULT hr = evSystem.CreateInstance(CLSID_CEventSystem);
if (!SUCCEEDED(hr)){
break;
}
IEventSubscriptionPtr evSubscriber;
hr = evSystem.CreateInstance(CLSID_CEventSubscription);
if (!SUCCEEDED(hr)){
break;
}
}while (false);
问题在于 CLSID_CEventSubscription 创建失败,并显示 HRESULT 代码 E_NOINTERFACE
。 Online docs for that error建议我使用错误的线程模型。但我尝试了 COINIT_MULTITHREADED
和 COINIT_APARTMENTTHREADED
,但都没有改变错误。有什么想法吗?
顺便说一句,我见过的最接近工作示例的是 given in this link .
最佳答案
根据MSDN其他部分,您不创建 SENS 对象。如果我没看错的话,您将创建一个 IEventSystem (CLSID_CEventSystem) 实例,在其中查询感兴趣的 SENS 发布者/事件类,并向它们注册您的订阅。
编辑: 对于您的新问题,我不确定根本原因,但我发现不使用 IEventSubscriptionPtr 似乎可行:
// Works
CComPtr<::IEventSubscription> pSub2;
hr = pSub2.CoCreateInstance(CLSID_CEventSubscription);
// Doesn't work
IEventSubscriptionPtr evSubscriber;
hr = evSystem.CreateInstance(CLSID_CEventSubscription);
关于c++ - 如何为 SENS 事件注册接收器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217878/