我正在查看说我可以CoCreateInstance a SENS object using its CLSID的MSDN文档。但是,尚不清楚__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);