2012-07-11 54 views
4

場景:
我試圖遷移C++應用程序的WinRT/Metro風格。此應用程序使用ATL/COM對象,該對象通過使用IDispatchImpl類實現IDispatch接口,但根據MSDN,IDispatchImpl不適用於Metro Style應用程序。基於ATL的COM對象/ Metro風格應用

我的ATL/COM類看起來是這樣的:

class MyATLClass : 
    public IDispatchImpl<IMyDispInterface, &IID_IMyDispInterface, &LIBID_MYLIB, 1, 0>, 
    public CComObjectRoot, 
    public CComCoClass<MyATLClass,&CLSID_MyATLClass> 
{ 
    ... 
} 

問:
是否有任何WinRT中更換的IDispatchImpl?

替換可能涉及派生自不同的類並丟棄我的IDL文件,例如。我的最終目標是能夠對MyATLClass的實例執行QueryInterface,並通過IMyDispInterface獲取參考。我也可以將所有文件(庫和應用程序)包含在單個項目中,但我希望避免在可能的情況下更改使用IMyDispInterface引用的代碼。

+0

,在一個WinRT的應用程序的允許的COM和WINAPI的子集是相當小的。這不僅僅是IDpatchImpl,對IDispatch的支持完全消失了。當然還有一些其他的winapi電話是你的ATL項目製作的。通過查看SDK頭文件Windows Kits/8.0/shared子目錄,可以大致瞭解所支持的內容。任何事情都是嚴厲的。將這些應用程序移植到Metro通常不容易,甚至不可能。 – 2012-07-11 18:31:18

+0

@ Hans Passant感謝您的評論。對於這個特定的庫,它不依賴於Win32,但它的特性作爲COM接口公開。我目前正試圖找到一種方法來定義從IUnknown派生的相同接口,以便我可以對它執行QueryInterface,但到目前爲止我還沒有成功。 – 2012-07-11 18:59:09

+4

你打算如何處理你的COM對象?如果它是從C++中消耗的,則不需要IDispatch。如果它是從C#中消耗的,則應該重寫爲C++/CX組件或WRL組件。 – 2012-07-12 05:18:01

回答