我想訪問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);
但是,在這種嘗試在變量結果有保存的錯誤,我無法訪問的子對象的方法測量。
我的錯誤在哪裏?我如何訪問子對象?
謝謝你的所有答案和提示!
我錯過了什麼,或者是不是這個東西'QueryInterface'是怎麼一回事?如果你確實查詢了它並且返回了NULL(與'result'中的錯誤類似,你真的應該在這裏發佈),否則機會是對象沒有實現它*或者*你忘記構建適當的編組代理/將它們分別註冊到客戶端和服務器上。 – WhozCraig
Casting一個COM接口指針*從不*正確,您必須使用QueryInterface()來獲取指針。名爲「UI」的屬性似乎不太可能用於提供度量,因此您需要知道對象模型才能正確使用。聯繫供應商尋求支持。 –
即使您只能獲得IDispatch,Visual Studio也可以使用'#import'更輕鬆地使用基於IDispatch的界面。 –