2016-08-14 55 views
1

我正在編寫一個實現C++中第三方接口的插件。我在MSVS中創建了一個ATL項目,添加了一個ATL簡單對象,然後使用該類的「實現接口」快捷方式。所有的接口方法都被扼殺了,並且它的構建。我還補充說:在C++中實現COM接口,方法不被公開

[assembly:System::Runtime::InteropServices::ComVisible(true)]; 

,並讓這些運行(成功)的構建之後:

regsvr32.exe VWorksCPPATL.dll 
regasm /codebase /tlb VWorksCPPATL.dll 

然而,當我打開OLEVIEW的DLL,我沒有看到任何公開的接口的方法(除了IUnknown)並且該DLL不會被該插件的容器加載。

當我打開一個在C#中編寫的工作DLL時,我看到我已經實現的接口以及它們在coclass下列出的方法。 (我已經在項目中設置了「註冊COM互操作」和「創建程序集COM可見」屬性。)

當我打開供應商(插件容器的創建者)在C++中編寫的工作DLL時,公開的方法/接口在一些但不是全部的DLL中。

我是否需要手動修改IDL文件以公開這些方法?現在它顯示(屬性省略):

interface IPF400 : IDispatch{} 
library VWorksCPPATLIB{ 
    coclass PF400{ 
     [default] interface IPF400; 
    } 
} 

...或者我可能有其他原因的麻煩嗎?

+0

您是否在COM/OLE Viewer中看到空類型庫或類型庫?你是否在臨時構建文件中產生了.TLB文件中需要的東西? –

+0

臨時TLB和嵌入式TLB是相同的。它們包含的都是IDispatch成員(GetTypeInfoCount等)。粘貼在這裏:https://gist.github.com/zbjornson/8805c2e85b3d70dd2248dd387fbcf231。我假設我需要修改IDL文件來說我正在實現其他接口,但我希望有一種自動的方式來做到這一點。 – ZachB

+0

看起來不錯。 'IPF400'在那裏。您的IDL'IPF400'也是空的,就像您在編譯的TLB中看到的一樣。 –

回答

1

好吧,我只好按照this answer說明的TLB從包含我實現接口的DLL導出,再加入importlib("....tlb")interface IFooInterface到IDL文件手動(屬性略):

interface IPF400 : IDispatch{ 
}; 

library VWorksCPPATLLib 
{ 
    importlib("stdole2.tlb"); 
    importlib("IWorksDriver.tlb"); // <-- Added 

    coclass PF400 
    { 
     interface IControllerClient; // <-- Added 
     [default] interface IPF400; 
    }; 

};