访问COM接口中的子对象

时间:2013-12-18 15:16:50

标签: c++ pointers interface com

我希望能够访问COM对象的子对象。在我的例子中,我使用CANoe COM服务器。

在我的程序中,我为CANoe应用程序创建了一个CAN接口。这是我到目前为止的代码摘录,它完全符合我的要求:

HRESULT result;

//prepare for COM handling...
result = CoInitialize(NULL);

//get CLSID of CANoe...
result = CLSIDFromProgID(L"CANoe.Application", &clsid);


if(SUCCEEDED(result))
{
    //connect to COM interface of CANoe...
    result = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, IID_IApplication, (void**) &pIApp);

    if(SUCCEEDED(result))

    {
        qDebug() << "COM connection established";
    }
    else
    {
        qDebug() << "COM connection error";
    }
}
else
{
    qDebug() << "Error: CLSID";
}

现在我想访问COM服务器的子对象。例如,Measurement对象。我用方法pIApp->get_UI()

尝试了它
IDispatch* pIDis;
IMeasurement* pIMeasurement;

result = pIApp->get_UI(&pIDis);

pIMeasurement = (IMeasurement*) pIDis;

指向COM对象的指针需要是IMeasurement类型的指针,因此我可以使用头文件中定义的所有方法。但方法get_UI仅支持IDispatch类型的指针。我试图将指针从IDispatch类型转换为IMeasurement。但是程序在运行时崩溃了。

我还试图直接创建一个新的接口到子对象:

    result = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, IID_IMeasurement, (void**) &pIMeasurement);

但是在此变量结果中尝试保存错误,我无法访问子对象Measurement的方法。

我的错误在哪里?如何访问子对象?

感谢您的所有答案和提示!

1 个答案:

答案 0 :(得分:0)

感谢@WhozCraig,@ Hans Passant和@Eric Brown的评论提示。

我能够使用以下代码解决我的问题:

 IDispatch* pIDispatch;

 //get pointer pIDispatch to Measurement object of CANoe...
 result = pIApp->get_Measurement(&pIDispatch);

 if(SUCCEEDED(result))
 {
    //pointer pIDispatch to pIMeasurement...
    result = pIDispatch->QueryInterface(IID_IMeasurement, (void**) &pIMeasurement);

    if(SUCCEEDED(result))
    {
       pIDispatch->Release();

       //work with connection here...

       pIMeasurement->Release();

    }

 }