我正在查看说我可以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_NOINTERFACEOnline docs for that error建议我使用了错误的线程模型。但是我已经尝试了COINIT_MULTITHREADEDCOINIT_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);

10-07 16:11