2016-09-27 63 views
1

我正在測試Delphi 2007,而我的groupproject由2個包組成。安裝包時無法加載包%s的錯誤

enter image description here

PackageRun.bpl

它標記爲 「只運行」,幷包含一個名爲中定義一個空TFRAME後裔 「uMyTestRun.pas」 單位:

unit uMyTestRun; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

type 
    TMyTest = class(TFrame) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

implementation 

{$R *.dfm} 

end. 

PackageDes.bpl

它需要PackageRun.bpl,它被標記爲「設計時只」,幷包含一個名爲中我寫了下面的代碼「uMyTestDes.pas」單位:

unit uMyTestDes; 

interface 

uses 
    Classes, 
    uMyTestRun; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('MyComponents', [TMyTest]); 
end; 

end. 

兩個包的輸出目錄在庫路徑(內有bpl,dcp和dcu)。


嘗試安裝PackageDes.bpl(組件,安裝包...,添加...),我收到以下錯誤:

Can't load package C:\<...>\PackageDes.bpl. Impossibile trovare il modulo specificato.

消息的最後一部分是在我的操作系統的語言,在英語中它應該是像「找不到指定的模塊」。 (我的操作系統是Windows 10 Pro 64位)。

PackageDes.bpl與錯誤消息(C:\ < ...> \ PackageDes.bpl)中顯示的路徑完全相同。 一些測試後,我發現該錯誤的去除uMyTestDes.pas單元以下行消失:

RegisterComponents('MyComponents', [TMyTest]); 

有什麼錯在我的代碼/項目/環境?

+0

運行時包是否可以通過設計時間包得到並「可找到」?這意味着它應該位於系統路徑變量的目錄中。這個軟件包也應該可以通過IDE找到。 –

+0

定義de組件TMyTest在哪裏?如何定義? –

+0

@GermánEstévez-Neftalí-我已經通過添加uMyTestRun.pas單元更新了我的問題 – ExDev

回答

6

http://SysInternals.com運行進程監視器並設置篩選器僅攔截Delphi IDE進程的文件操作(工具欄最右邊的按鈕)(檢查TaskManager中的進程名稱或快捷方式屬性(它是Delphi XE2的bds.exe)),然後添加過濾器類似於包含/進程名稱/結束與/ bds.exe)。

然後清除PM中的日誌,切換到Delphi並嘗試加載軟件包,然後一旦出現錯誤,切換回PM並停止捕獲事件。儘可能快地做到這一點,例如,不要浪費時間關閉錯誤框。

現在你會得到Delphi加載你的包的文件I/O活動的痕跡(和其他一些背景活動噪聲 - 你做得越快,噪聲就越少)。在跟蹤中查找所有錯誤,並查看Delphi試圖找到哪些軟件包以及哪些軟件包。

如果您的Design-Time BPL具有可解析的所有DLL依賴關係樹,您還可以嘗試使用Microsoft Dependency Walker或類似工具。我個人通常使用帶有FileInfo插件或ntCore CFF Explorer的Unreal/Total commander。

+1

即使我已經通過閱讀評論解決了我的問題,我嘗試了您的解決方案,並且我可以說它會起作用。 ProcessMonitor顯示了很多操作,試圖在所有系統路徑變量路徑中查找「PackageRun.bpl」,對於這些操作中的每一個,結果都是「NAME NOT FOUND」。我想ProcessMonitor將會在以後節省我的時間,謝謝! – ExDev

+0

這就是爲什麼我提到它 - 雖然你已經抓住了這個特定的魚,但有一個釣魚竿所有類似的未來麻煩永遠不會壞:) –

-3

嘗試將register程序更改爲uMyTestRun單元。

unit UMyTestRun; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; 

type 
    TMyTest = class(TFrame) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('MyComponents', [TMyTest]); 
end; 
end. 

現在,軟件包將正確安裝。

問候。

+3

我試圖從運行時間部分中劃分出設計時間。 – ExDev

0

來解決這個問題簡單的方法是一個後生成操作添加到您的運行時項目:

copy "$(OUTPUTDIR)\$(OUTPUTFILENAME)" "$(BDSCOMMONDIR)\Bpl" 

上面拷貝命令的運行時文件的默認IDE櫛Bpl位置。