2012-11-09 40 views
1

雖然我在做VB6開發,但我認爲這是一個更廣泛的問題。我發現有時在VB IDE中會出現一個錯誤:[BadImplementsRefInCompatLib]。使用Matt Curland的「高級Visual Basic 6」附帶的類型庫查看器,它標誌着我的組件中的類型庫有一個它找不到的類型庫的引用,但不是它是什麼。當TLI組件試圖找出在另一個類型庫中定義的接口時,底層的錯誤與TLI組件有關。無效的外部類型庫引用(「錯誤加載DLL」)

我也試過OLE視圖 - 嘗試並反向編譯IDL - 但同樣,它在嘗試獲取外部類型時給出了一條錯誤消息,而沒有標識出錯誤的值。

我將實際錯誤追溯回註冊表中指向組件的類型庫引用,但主要版本不正確。替換主要版本解決了問題。

我使用了二進制編輯器來查看是否可以發現在類型庫中使用了哪些信息。事實上,我找到了它引用的組件的名稱(沒有路徑),但我無法制定出格式。我實際上希望找到一個類型庫GUID和版本號的表。我想我可以編寫代碼來提取這些名稱,並消除「工作」引用,但這有點粗糙。

有誰知道類型庫如何引用外部類型?

+1

類型庫有一個版本號有一個很好的理由。您可以編輯此問題,但在調用已更改的過程時,這隻會在運行時產生無法識別的故障。只有獲得並註冊正確的類型庫纔是解決方案。 –

+0

@HansPassant - 我完全理解版本化類型庫的要點。不幸的是,TLI組件的行爲並不是非常有用 - 它提供了一個錯誤,但沒有提供某種形式的關於* why的信息*它無法解析引用,所以我可以採取適當的措施。此刻,我必須猜測爲什麼它沒有奏效! –

回答

2

[BadImplementsRefInCompatLib]意味着您的二進制兼容目標的typelib具有對外部typelib的引用,並且此外部typelib未註冊。

舉例來說,如果你有多個ActiveX DLL的一個項目組被設置爲二進制兼容的版本兼容性Project2引用Project1Project1休息的兼容性和(在一個公共類的功能/性能的原型使用的類型從PROJECT1)得到重新編譯Project2的兼容性目標有一個typelib引用未註冊的外部typelib(即舊版本的Project1組件)。

在我們的商店中,我們確實提供了跨VB6項目的參考,但從未在類的公共方法/屬性中使用核心類型。這些參數被聲明爲As Object,並以代碼方式向下轉換,這比與外部交叉引用綁定組件相比麻煩少。經常使用Curland的EditTLB來發現違規課程。

不知道類型庫如何引用外部類型。我只是在idl中使用importlib("component.tlb"),並且可以隨意使用component中的類型。

順便說一句,在VB6 IDE中「保護」COM組件(DLL/OCX)的一個非常簡單的方法是在外部定製的typelib(公共方法的參數)中引用struct,然後「忘記」運送此外部typelib。如果您不嘗試調用此「混淆」方法的交叉線程(正在處理或未處理),VB6 IDE扼流器將與「DLL加載錯誤」添加對DLL/OCX的引用,但該組件工作並完美註冊。

+0

是的,我從我自己的實驗中得到了一般的要點。不幸的是,我正在使用超過10年的開發代碼,並且有150多個組件,所有這些組件都具有交叉依賴性。有趣的是,您的商店基本上放棄了在公共界面上使用自己的類型。回想起來,這就是我正在使用的代碼應該完成的工作。但是,我堅持我所擁有的,並且有一種方法可以追溯這些僅限於開發的錯誤的依賴關係鏈並輕鬆修復它們。 –

+0

你如何編譯這150多個組件?你必須對它們的交叉依賴關係進行topolically排序,所以你必須保持這些引用的記錄。如果你有一個構建服務器,開發者永遠不需要在他們的機器上編譯組件(如果他們需要的話,就直接在服務器上開始構建)。我們在開發機器上保持vbp的項目兼容性,並且永遠不會獲得'[BadImplements]'。 IDE在項目兼容性方面也得到了更多的響應。 – wqw

+0

我們使用Nant來構建這些組件。是的,我們必須理清所有的依賴關係。我們唯一不做的就是在開發機器上使用項目兼容性。說實話,我認爲這隻在編譯組件時很重要。在項目運行時使用項目兼容性是否基本上告訴IDE「修復uo」所有的引用? –

相關問題