2008-11-11 168 views
10

我有一個用vb6編寫的COM DLL。當我嘗試從這個DLL創建一個類模塊的新對象時,我得到一個運行計時器錯誤430:類不支持自動化或不支持預期的接口。有趣的是,這隻發生在IDE之外,當我從IDE內部調試時,沒有拋出任何錯誤,並且類的新對象被成功創建。原因是什麼?什麼可能會導致Vb6運行時錯誤430

一般來說,我偶爾會在COM dll中遇到這類錯誤。調試COM問題的最佳方法是什麼?如何知道程序運行時正在使用的dll的路徑?

回答

9

如果這個項目完全在VB6中。造成這種情況的可能原因是EXE在目錄中有一個DLL二進制文件的副本。當你啓動它時,使用該副本而不是編譯副本。當您添加EXE與舊DLL不兼容的方法或類時。如果你做了一個錯誤修復或者只是使用了內部代碼,那麼EXE將運行,但它使用了舊的DLL。

將您的DLL設置爲二進制兼容性。 確保您有兼容的目錄。 將最後一個版本的DLL放在那裏。 將二進制兼容性指向該DLL。 確保您的EXE編譯爲它的項目目錄。 從它的項目目錄運行EXE。這樣它將使用您編譯的DLL。 您需要編寫一個實用程序,以便您可以分別編譯每個項目。 使用Virtual PC或其他計算機測試您的設置。

所有這些步驟將有助於避免DLL地獄。我自己的項目有6個層次上的二十個ActiveX項目。當我通過上述我的DLL地獄問題幾乎沒有下降。

2

這幾乎可以肯定是一個版本問題,有時稱爲「DLL地獄」。

背景是.NET世界被明確設計爲讓接口在保持相同名稱的同時進化。但在COM世界中,接口被認爲是不可變的。

當您在IDE中工作時,每次運行解決方案時,Visual Studio都會爲COM dll創建一個新的COM Interop包裝。但除非您每次發佈並替換整個解決方案,包括全新的COM Interop包裝器,否則您將遇到版本控制問題,其中.NET代碼期望一個COM接口但看到另一個COM接口。

編輯:出於某種原因,我假定您正在嘗試使用.NET組件中的COM組件。如果整個解決方案實際上是VB6,那麼Conley先生的解決方案就是推薦的方法。討論這個問題的Here's a good link

4

閱讀二進制與項目兼容。

如果你有你必須要小心,併兼容使用二進制共享DLL。這樣VB6將保持構建之間相同的COM簽名/接口。你必須有一個VB6發佈DLL的副本進行比較 - 我通常有一個單獨的文件夾發佈的二進制文件。二進制兼容性的限制是您不能刪除公共屬性或方法,也不能更改其簽名。您可以添加新的屬性和方法。

使用項目的兼容性,如果你必須做出重大更改(如刪除舊的公共方法) - 但是如果你這樣做,你將不得不重新編譯使用共享的DLL的所有其他應用程序。

相關問題