COM dispinterface事件

时间:2014-05-14 08:11:18

标签: c++ com

我是一名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;
}

我知道如何为双界面创建实例,如上所述。但我需要帮助来实例化事件的dispinterface。非常感谢您的帮助。

1 个答案:

答案 0 :(得分: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对象附加和接收连接点事件。