2013-12-18 79 views
2

我想訪問COM對象的子對象。在我的例子中,我使用了CANoe COM服務器。在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服務器的子對象。例如測量對象。餘與方法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); 

但是,在這種嘗試在變量結果有保存的錯誤,我無法訪問的子對象的方法測量。

我的錯誤在哪裏?我如何訪問子對象?

謝謝你的所有答案和提示!

+2

我錯過了什麼,或者是不是這個東西'QueryInterface'是怎麼一回事?如果你確實查詢了它並且返回了NULL(與'result'中的錯誤類似,你真的應該在這裏發佈),否則機會是對象沒有實現它*或者*你忘記構建適當的編組代理/將它們分別註冊到客戶端和服務器上。 – WhozCraig

+3

Casting一個COM接口指針*從不*正確,您必須使用QueryInterface()來獲取指針。名爲「UI」的屬性似乎不太可能用於提供度量,因此您需要知道對象模型才能正確使用。聯繫供應商尋求支持。 –

+0

即使您只能獲得IDispatch,Visual Studio也可以使用'#import'更輕鬆地使用基於IDispatch的界面。 –

回答

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(); 

    } 

} 
+0

爲什麼,爲什麼你不使用智能指針... – sharptooth

+0

@sharptooth:嗯,我認爲沒有理由不使用智能指針。我將在未來的版本中使用它們。謝謝!一個問題只是爲了更好的理解:智能指針具有單一的便利性,我不需要手動刪除它們,不是嗎?但是它們不能替代COM對象的Release方法的需要嗎? –

+0

特殊的智能指針,例如'CComPtr'和'_com_ptr_t'將'釋放()'這個對象,這會讓你的代碼更清潔三倍,同時也是異常安全的。 – sharptooth