2014-03-27 19 views
2

我有一個VCL Forms應用程序,其中包含對我創建的BPL文件的引用。我將框架組件的單元名稱從BPL添加到VCL應用程序主窗口的uses子句中。該應用程序構建得很好,但是當我運行它時,它會在到達項目文件中的第一行「Application.Initialize」之前死亡。如果我從uses子句註釋出框架的單元,應用程序啓動並運行良好。將應用程序轉換爲BPL,現在應用程序死在Application.Initialize

應用程序啓動時可能導致致命錯誤的原因是什麼?

我猜在啓動時加載BPL文件時出現問題,但我無法找到問題。謝謝。

更多信息... VCL應用程序在XE5中,我試圖將它轉換爲BPL。整個應用程序駐留在一個TFrame控件中,其中包含許多其他按鈕和框架,可以訪問應用程序的所有基礎功能。然後將這個「主框架」放置在除少數菜單項之外爲空的應用程序主表單中。原來的應用程序構建並運行良好。

我創建了一個新的BPL項目,並添加了這個「主框架」組件,努力創建一個基本上是我的整個應用程序的BPL包,這可以像以前一樣用於一個普通的獨立exe應用程序,或者添加到RemObjects Hydra插件模塊中,並最終嵌入到C#應用程序中。帶有單個「主框架」組件的BPL項目可以毫無錯誤地構建。

然後,我創建了一個帶有一個空主表單的新VCL Forms應用程序,並設置了項目的「Options-> Packages-> Run-time Packages」以包含我的新BPL,並將「Link with run時間包「選項。我在主窗體的uses子句中添加了「主框架」單元,並且所有內容都沒有錯誤地構建。

問題:當我從XE5運行應用程序時,它似乎開始正常啓動,但它在到達第一行代碼「Application.Initialize;」之前就會死亡。在項目文件中。請注意,我還沒有編寫任何代碼來創建BPL中「主框架」的實例。我只是將它的單元添加到uses子句中。沒有顯示錯誤消息,也沒有任何消息發佈到XE5的「生成」或「輸出」窗口。如果我從uses子句註釋掉「主框架」單元,那麼應用程序運行良好,並顯示空的主窗口。

注意:該應用程序使用JVcl,NativeXml,TsiLang,ZipForge,& FastReports。

+0

是。聽起來像是無法找到bpl。你爲什麼認爲應該找到它? –

+0

需要從系統路徑或應用程序文件夾中訪問BPL文件。您應該確保BPL文件位於這兩個位置之一中。 – Graymatter

+0

@Graymatter從技術上講,它們使用DLL搜索順序進行搜索:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586.aspx –

回答

0

您描述的症狀是加載時間依賴性解決方案失敗的症狀。從你所描述的情況來看,很可能是由於你的BPL文件沒有在加載時定位。加載時間程序包依賴性由系統加載程序處理,因此應用DLL搜索順序。通常,您可以確保依賴模塊與可執行文件位於同一目錄中。

在調試器下運行時,加載時間依賴性失敗處理不好。如果您直接啓動可執行文件,您將得到更好的錯誤消息。如果這還不足以識別問題,請在配置文件模式下使用Dependency Walker來獲取任何加載時間錯誤的詳細診斷信息。

關於Embarcadero關於軟件包部署的建議的最後一條評論。官方Embarcadero documentation仍建議將共享軟件包安裝到系統目錄。雖然這是20年前在Windows 3.1下的普遍做法,但沒有人應該在世紀中這樣做。請不要遵循Embarcadero的這個特別建議,並且請尊重系統目錄屬於系統的事實。

相關問題