【问题标题】:COM dispinterface eventsCOM 调度接口事件
【发布时间】:2014-07-02 04:15:58
【问题描述】:

我是一名 COM 初学者,并尝试通过 COM 在我的 c++ 项目中使用托管库。我可以为双接口创建实例并调用方法……它工作正常……

我想知道如何构造可以接收来自任何dispinterface COM对象的事件的客户端接口?

#include "stdafx.h"
#import "../COMLib/bin/Debug/COMLib.tlb" named_guids
#include <comutil.h>

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);

COMLib::ICalcPtr pCalc;

HRESULT hRes = pCalc.CreateInstance(__uuidof(COMLib::Calc));
if(FAILED(hRes))
    printf("ICalcPtr::CreateInstance failed w/err 0x%08lx\n", hRes);
else
{
    printf("%d\n", pCalc->Factorial(10));
}

CoUninitialize();
return 0;
}

我知道如何为上面的双接口创建实例。但我需要帮助来实例化事件的调度接口。非常感谢您的帮助。

【问题讨论】:

  • “工作正常” - 那么的问题是什么?
  • 为双接口工作。不知道如何为调度接口创建实例。我必须从调度接口接收事件。
  • 理解 COM 的诀窍是要清楚你不创建接口的实例。您创建一个 CoClass 的实例,然后为您需要/ CoClass 实现的任何内容创建 QueryInterface。您不是在创建分派接口的实例。您正在访问已创建的某事物实例的调度接口。

标签: c++ com


【解决方案1】:

一旦您拥有 Com 实例,请继续使用 queryinterface 以获取您需要使用的任何其他接口。假设它实现了 IDispatch,您将有一个指向该接口的指针。

COMLib::ICalcPtr pCalc;

HRESULT hRes = pCalc.CreateInstance(__uuidof(COMLib::Calc));
if(FAILED(hRes))
    printf("ICalcPtr::CreateInstance failed w/err 0x%08lx\n", hRes);
else
{
    IDispatchPtr pDisp;
    hRes = pCalc->QueryInterface(IID_IDispatch, &pDisp);
    ASSERT(SUCCEEDED(hRes));

    printf("%d\n", pCalc->Factorial(10));

}

如果您希望从该对象接收 COM 事件,您可能真的需要IConnectionPoint 接口集。 This article 有很好的解释和示例,说明如何在 C++ 中从 COM 对象附加和接收连接点事件。

【讨论】:

  • 感谢 dkackman... 我正在为 IConnectionPoint 接口集寻找一个好的起点。我有一个处理某些事件的接口,我希望在客户端触发这些事件。
  • 从上面的 codeproject 链接开始,然后网上有很多例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2012-05-20
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多