c++ - 如何为 SENS 事件注册接收器对象

标签 c++ windows winapi com interface

我正在查看 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_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);  

关于c++ - 如何为 SENS 事件注册接收器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217878/

相关文章:

c++ - 如何完全绕过 `error: no match for ‘operator==’`?

c++ - 为什么 MSVC 大发脾气编译宏,而 G++ 是关于禅宗的?

c++ - 带有移动端的前向迭代器()

Windows 显示设置为 150% 时仍显示 96 DPI

windows - Git - 推送新的提交并忽略未提交的更改

c++ - 如何在C++中输入整数而不使用 ">>"

Java 被识别,但 Javac 未被识别

c++ - 处理打开方式的事件 (WinApi)

windows - 在失焦时接受输入

c# - WaitForSingleObject 返回 ERROR_INVALID_HANDLE