簡體   English   中英

解決BPL無法加載但仍已重新編譯的Delphi BPL包問題(Windows VirtualStore文件系統問題)

[英]Solving Delphi BPL Package problems where BPLs won't load but you've already recompiled (Windows VirtualStore filesystem issue)

我的一般問題是你如何排除故障“我的BPL不會因為依賴而無法加載,無論我清理和重新編譯多少”。 更新你可能認為你有一個干凈的重新編譯系統,但由於Windows的反奇跡及其文件系統虛擬化錯誤功能,你還沒有。

當我嘗試將我的設計時包(在本例中名為dclFsTee.bpldclFsTee.bpl到我的Delphi IDE中時(它是快速報告4 teechart包裝器組件包),它抱怨:

The program can't start because tee7100.bpl is missing from your computer. Try reinstalling ...

在我知道的系統上的任何DCP或DCU文件中都沒有引用tee7100.bpl 但顯然,有些事情是錯的,我找不到問題。

所有Delphi用戶都面臨着一百個“不會編譯或不會加載”BPL問題。 當被問及做什么時,通用副詞是清理您的計算機。

但是,我現在花了幾個小時來清理我的計算機,雖然一切都編譯了文件,但顯然必須有某些東西過時隱藏,因為我試圖加載的結果BPL文件仍然想加載一個版本的幾天前我從這個系統中刪除的TeeChart BPL,以及我能找到的每一條痕跡。

我刪除的Delphi 2007中的TeeChart內容包括$(BDS)\\ Lib和$(BDS)\\ Lib \\ debug文件夾中的所有內容,以及系統上的所有DCP和BPL文件夾。 此外,每個名為TeeChart-unit的dcu文件都已消失。

一旦你走到了盡頭,你接下來會嘗試什么? (格式化硬盤,購買新電腦。)說真的。 我認為我是一個聰明的人,但我有一個1 Tb的硬盤驅動器,一個運行到80多個文件夾的庫路徑,以及一個似乎組織良好的源代碼存儲庫,但顯然有些東西隱藏在我不能的地方找到它。

我有TeeChart Standard 2012,有完整的源代碼,據我所知,我的開發機器不再包含任何舊的TeeChart BPL或來自delphi附帶的“tee chart tee7100.bpl”版本的DCP文件。

我已經運行了teechart附帶的“recompile.exe”向導,在向tee.inc文件寫入{$ DEFINE x}聲明后,它似乎只運行MSBuild並構建包(源代碼中有兩個)分配)。

但是,不知何故,似乎默認情況下,其中一個隱式導入到其中一個軟件包中的是一些尚未重建的過時文件,因此會嘗試加載tee7100.bpl。 新的bpl名稱是tee911.bpl。

而不是問一些非常具體的快速報告問題,我只是提到它是我在Delphi開發時遇到過幾十次傷害的一般世界的具體例子。

我只給出了快速報告的詳細信息,這樣你就可以看到這實際上是一個普通問題的特定實例,當處理組件源代碼或包或包含有依賴關系的包時,有時會在Delphi IDE中面臨這個問題。 。 清理您的計算機,以便您的代碼甚至構建可能是棘手的。

所以這是我的Delphi包到包依賴解析問題:

  1. 找到或跟蹤隱藏加載一些不再需要的BPL問題的最有效方法是什么,這樣我的代碼(構建和編譯就好了!)實際上會加載到Delphi IDE中。 運行重新編譯產生的BPL文件似乎正確鏈接到正確的DCP文件,並且不存在舊的/陳舊的DCP或DCU文件。 例如,新的DCP文件名是tee911.dcp。

  2. 你能以某種方式得到任何關於什么包實際上是陳舊的,以及在.bpl鏈接時正在讀取和鏈接以及靜態導入的內容嗎? (我想可能像BPL文件的特殊MAP類文件?)

更新經過數小時的戰斗,並使用我所知道的每一個技巧,我意識到我沒有檢查過Windows 7中文件虛擬化引起的一些VirtualStore相關問題 。這意味着Windows 7依賴於運行在它。 它為您提供了該文件的另一個版本,而不是您想要的版本。 這在幾個方面可能是致命的; 一; 你重新編譯了一個BPL,但那不是加載的。 殺死我的BPL位於SysWow64文件夾中,該文件夾是VirtualStore的一部分。 請注意,虛擬存儲基本上會出現幻像文件,只有當你是一個特定的“低級別”程序時才會出現,其中Delphi 2007在Win7 / 64位上顯然是這樣。 要刪除當前用戶帳戶的SysWow64 VIRTUALSTORE文件夾中的BPL文件,請執行以下操作:

   del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl

...有些日子我只討厭Windows架構。 無論如何,我不打算將上述內容作為答案,因為我想知道是否有人有更好的方法或任何可能有助於下次的提示或建議。

好的,沒有其他人回答,所以我會把它放在這里對未來的人們有所幫助:

- 在清理破壞的系統時記住Windows VirtualStore,這些系統上有舊版本的DLL,包括TeeChart,FastReport,Indy等,這些系統往往涉及混亂,因為它們可以作為“裝有delphi的外包裝”存在如果您直接從供應商處購買和安裝它們,或者經常安裝為升級版本,或者您可以在公司的mega-component-pack目錄中擁有自己的編譯副本。

- 當搜索重復或過時的BPL時,在Windows中進行文件搜索不會查看虛擬商店,您必須手動查找並刪除整個虛擬存儲區域,以供您的進程或用戶或程序使用。

這個問題的第二個層面是:

FastReports的依賴關系圖很復雜:

  • 這取決於Indy,你可能擁有自己的Indy版本,而Delphi本身就有一個,而你硬盤上的其他東西可能都有自己的Indy副本。

  • 它支持各種版本的TeeChart,包括Delphi附帶的二進制文件,以及您可能從Steema購買的標准版或其他購買的TeeChart版本。

  • 它使用預編譯的頭文件包含文件進行編譯,而不僅僅是一個名稱相同的include(.inc)文件的一個而是兩個不同的副本。

  • 當您使用自己的編譯器工具(重新編譯FastReport)時,它的工作非常可靠,但是當您想要從單個構建腳本構建項目中的所有內容時,這不是最好的,因此是我的問題的根源。

  • 關鍵是要學習所有關於你的巨大包裝中所有組件的依賴關系的知識,並干凈地組織你的系統,這樣你就不會有舊東西(比如Indy和TeeChart bpls,dcp或dcu)文件)躺在身邊。 如果你不知道自己在做什么,那么清理它是一項非常復雜的工作。

    • 用於真正刪除系統附帶的Indy和TeeChart版本的所有痕跡的實用程序,以及FastReports的“Embarcadero版本”是解決此問題的關鍵。 一般提示是“如果X版本與Delphi一起發布,並且您要安裝新版本,請准備好直到您的系統真正清理完畢”。

    • 避免所有這些廢話的一個非常神奇的技術是在最初的Delphi IDE安裝過程中不安裝Indy,FastReport或TeeChart(取消選中或跳過它們),然后從源代碼中逐個安裝它們。 僅僅因為在Delphi中預安裝了一個版本並不是一件好事。 (更新:你不能再在安裝過程中取消選擇Indy,它至少是Delphi XE8的基礎Delphi產品的一部分。從Delphi自己的lib目錄中刪除內置Indy的清理實用程序對任何自己構建的人都是必要的。 。)

    • 另一個非常神奇的技術是在虛擬機上運行商業組件的安裝程序,然后收集pascal源代碼並將其傳輸到您的清潔開發機器上,並自行構建。 這樣你可以避免在你的系統中散布BPL和東西時發生的可怕事情,甚至安裝到C:\\Windows\\System32 (在32位系統上)和C:\\Windows\\SysWow64 (等效路徑)在64位系統上)。

把那個BPL(tee7100.bpl)放在$(BDSCOMMONDIR)\\ Bpl下

for XE: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio\8.0"
for XE5: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio\12.0"

可能導致此問題的另一個問題是,沒有將.bpl文件存儲在系統路徑中的文件夾。

這是因為Delphi嘗試使用文件名而不是絕對路徑調用WinAPI函數LoadLibrary。 因此,如果Windows無法找到該文件,Delphi無法加載它。

有關更多信息,請參閱此論壇帖子

這似乎是Windows 7中的問題,但不是在Windows 10中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM