2010-03-08 51 views
3

我必須維護一箇舊的VB 6 ActiveX DLL,由另一個第三方程序調用,我沒有源代碼等等。這個DLL工作和編譯罰款對所說的程序的API約6年和3個主要版本。如何解決編譯VB 6程序時出現的「意外錯誤(32801)」?

但現在,當我嘗試編譯DLL對新的主要版本發生提到的錯誤。看起來錯誤發生在「我的」代碼被調用之前,所以沒有使用調試或日誌記錄。唯一的補救措施是編譯沒有實際選項的W/O二進制兼容性。我的谷歌搜索出現了相同的問題,但沒有解決方案的一些人。

有沒有人知道如何解決這個問題?

在此先感謝

萬歲

回答

1

這聽起來像在你的新DLL定義的接口的類型之一是從一個在前面的DLL不同。我推斷你在DLL的公共接口中使用第三方程序中定義的類型。這聽起來像第三方已經改變了其中一種類型的定義,但保持名稱和GUID相同。你可以使用類似OLE/COM Object viewer的東西來檢查是否屬實。如果這是真的,那麼你可以向第三方程序的發佈者投訴。你有足夠的政治力量取得成功嗎?

Bruce McKinney,寫了Hardcore Visual Basic 6的專家,在類型庫中運行了into the same issue,他在結構中改變了一些成員類型。他唯一能找到的解決辦法是(基本上)打破二進制兼容性 - 那是在與VB6編譯器團隊(他非常熟悉)之間進行了一些通信之後。我不認爲別人能做得更好。

+0

你已經推導出正確。我檢查了新版本的IDL。他們只是在一些有幫助的評論和增加一個新的界面方面有所不同。幫助字符串中的更改與此無關,但新接口又如何?我認爲添加新界面不會破壞二進制兼容性。如果是這樣,我將不得不打電話給暴徒,並將它們發送給我最喜歡的第三方供應商;-) ... – banzai

+0

我不會認爲添加接口會導致任何問題。從閱讀鏈接聽起來像非常微妙的變化可能會導致此問題 - 如重新排序類型中的元素或對數據類型做出明顯無害的更改。 – MarkJ

+0

我也是 - 如果這是錯誤的原因,那必須是一個非常微妙的變化。沒有重新排序或這樣,只有一個新的界面。我認爲FileSystemObject是一個不太可能的原因,因爲我的界面中沒有公共類型,創建對象是通過後期綁定來避免已知由舊版本IE和MS腳本庫導致的兼容性問題。因爲這只是一個編譯時問題,所以我將保持一切不變 - 針對較舊版本編譯的代碼可以與新的主要版本的調用應用程序一起運行良好。在這裏繼續努力。 – banzai

0

有一個關於這個devx.com錯誤似乎表明,這個問題從微軟的腳本運行時(的scrrun.dll)朵朵討論。

FileSystemObject compatibility Unexpected error (32810)

請問您的DLL引用該庫?如果是這樣,您是否可以刪除引用(例如,使用內部VB文件處理函數和/或API調用替換FileSystemObject功能)。

+0

該項目沒有引用MS庫,但通過後期綁定(CreateObject(...))使用FileSystemObject。你真的認爲這可能是錯誤的原因嗎?您在上面提到的帖子是從2001年開始的。我的代碼直到2009年12月才編譯完成,從那時起絕對沒有代碼更改。我在我們的版本控制系統中對此進行了仔細檢查。唯一的變化是調用應用程序的新的主要版本。 – banzai

+0

@banzai:如果你多年沒有觸及它,你的代碼可以打破。如果其中一個依賴項(例如FileSystemObject)中斷,則可能會遇到像這樣的奇怪錯誤。 *你的*問題實際上與FileSystemObject有關?我不知道。嘗試刪除對它的所有引用並查看是否仍然出現該錯誤。爲了測試這個,代碼不需要工作,只需要編譯,所以你可以首先評論出你需要的任何東西,而不是實際替換FSO的功能。 – raven

+0

如果問題中的描述是正確的,那麼我認爲問題是由第三方API以不正確的方式更改其類型庫引起的。它從鏈接看起來好像微軟曾經與FileSystemObject犯過類似的錯誤(如果** Matthew Curland **這樣說,那肯定是真的)。並不一定意味着Banzai的問題是由FileSystemObject引起的。來自FileSystemObject的類型不太可能包含在banzai的公共接口中,但很可能來自第三方API的類型包含在公共接口中。 – MarkJ

0

與正在編譯的核心項目相關的任何文件是否標記爲只讀(即未檢出SourceSafe或類似的存儲庫)?

* .EXP * .vbw * .LIB

+0

所有這些臨時文件類型都不受版本控制。爲了確保我「無保護」的一切,並試圖編譯 - 與以前一樣的錯誤。 – banzai

3

我終於弄清楚如何以系統化的方式診斷VB6錯誤32801。

我的理論是當VB6編譯器創建項目或二進制兼容庫時,編譯器會從引用的庫中反編譯類型信息。發生錯誤32801源代碼的類型信息與引用的庫不相同。

有一個名爲OLEView的工具。該工具可以將COM類型信息反編譯爲IDL文本。我所做的是將引用的庫反編譯爲IDL,並對失敗的庫進行最後的構建。大多數情況下它是構建服務器版本,但構建在開發人員工作站上不起作用。反編譯最後的良好構建。使用文本比較工具,如WINMerge,並找出類型庫之間的差異。這些差異使得很容易找出問題。

根據不同將決定如何糾正。緩解可以通過糾正參考DLL或源代碼糾正或源代碼參考來完成。

相關問題