2013-03-11 108 views
2

我在COM中比較新,所以如果這是一個愚蠢的問題appologies。我有一堆COM接口編譯到類型庫A。此類型庫是我解決方案中的一個DLL(a.dll)中的資源。在一個單獨的類型庫(B)中,它將進入一個單獨的DLL(b.dll)我想定義一個實現來自類型庫A的接口的coclass。看到IDL代碼以下爲我心裏有一個簡單的例子:COM coclass實現另一個類型庫的接口

import "oaidl.idl"; 
import "ocidl.idl"; 

// Import IMyInterface, which is part of MyLibA.tlb 
import "MyInterface.idl"; 

[ 
    uuid(E80492A8-1E8C-4ABF-B4DE-9C252C445AFE), 
    version(1.0), 
    helpstring("MyLibB Type Library") 
] 
library MyLibB 
{ 
    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 
    importlib("MyLibA.tlb); 

    [ 
     uuid(25E3CD5E-FA06-4845-BE3E-F260985AFB20), 
     helpstring("My CoClass") 
    ] 
    coclass MyCoClass 
    { 
     [default] interface IMyInterface; 
    }; 
}; 

我可以編譯上述確定,但是當我在OLEVIEW打開由MIDL生成的TLB文件,我得到一個錯誤信息TYPE_E_CANTLOADLIBRARY。我開始懷疑我想做什麼是不可能的。到目前爲止,我的實驗表明,類型庫需要包含coclass與coclass定義本身一起實現的所有接口。這是真的?

如果刪除了importlib("MyLibA.tlb);語句,我可以查看在OLEVIEW編譯TLB文件而不錯誤,但MyLibB.tlb然後還包含IMyInterface接口的定義,即,該接口在兩個類型庫定義了兩次。我不想要這個,因爲在我的應用程序中,我使用免註冊的COM加載了a.dllb.dll。在這種情況下,當它在多個類型庫中遇到相同的接口定義時,激活上下文生成將失敗。

任何建議如何我可以在單獨的類型庫中實現所需的接口和coclass分離?

+0

謝謝,工作,我現在可以查看OLEView中的MyLibB.tlb的tlb。我沒有註冊MyLibA.tlb的原因是因爲我使用免註冊的COM。 – themik81 2013-03-11 16:27:48

+0

我已刪除評論並將其添加爲答案,以防別人認爲它有用。 – 2013-03-11 16:49:18

回答

3

當OLE/COM查看器顯示TYPE_E_CANTLOADLIBRARY時,這通常意味着從正在打開的引用的另一個TLB未正確註冊。

解決的辦法是使用類似regtlbregtlib或替代方法的工具註冊依賴關係TLB(本例中爲MyLibA.tlb),具體取決於您的系統。

由於這個問題是在免註冊的COM環境中給出的,所以您應該意識到與編組接口實例有關的可能問題。通常,TLB必須註冊才能使用標準編組器。否則,您必須確保正確地聲明您的清單中的編組信息,如上所述here

+0

是的,我認爲tlb不知怎麼損壞,因爲OLEView不會打開它,但那是因爲MyLibA.tlb沒有註冊。我證實了在我的註冊免費的COM場景中,我可以使用我的coclass而不需要註冊tlb,我只需要註冊OLEView。 – themik81 2013-03-11 16:51:15

+0

我已經在答案中添加了一條註釋,因爲您可能在編組過程中遇到問題,因爲tlbs沒有註冊。 – 2013-03-11 17:01:41

相關問題