全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2707
推到 Plurk!
推到 Facebook!

如何載入指定目錄的下 bpl 的 Package 檔案?

 
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-28 16:32:51 IP:60.248.xxx.xxx 未訂閱

當程式功能越多就會想要將程式以模組的方式分割,而 Package 使比 DLL 較好的選擇。

但是編譯完成後,都需要將 bpl 檔案放在 EXE 同一目錄下或是 System32 目錄下,這樣程式執行時才找的到。

若是希望將 bpl 放置在 EXE 目錄下的子目錄中或是其他目錄時,該如何指定載入呢 ?

------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-31 20:47:05 IP:219.134.xxx.xxx 未訂閱
静态加载 BPL 的话,可能你需要把 BPL 所在的 path 加入到系统搜索的 path 里去。

动态 Load 的话,肯定可以在代码里写了。
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-01 10:36:58 IP:60.248.xxx.xxx 未訂閱

我所要處理的是動態載入,目前程式碼如下:

主程式:
unit uMain;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function CreateFormByClassName(const ClassName:String): TCustomForm;
function CreateDataModuleByClassName(const ClassName:String): TDataModule;
procedure UnLoadAddInPackage(ModuleInstance: HModule);

var
Form1: TForm1;
ModuleInstance1: HModule;

implementation

function CreateFormByClassName(const ClassName:String):TCustomForm;
var
AClass: TPersistentClass;
begin
Result := nil;
AClass := GetClass(ClassName);
if AClass = nil then
exit;
Result := TComponentClass(AClass).Create(Application) as TCustomForm;
// 或
// Result := TCustom(TComponentClass(AClass).Create(Application));
end;

function CreateDataModuleByClassName(const ClassName:String): TDataModule;
var
AClass: TPersistentClass;
begin
Result := nil;
AClass := GetClass(ClassName);
if AClass = nil then
exit;
Result := TComponentClass(AClass).Create(Application) as TDataModule;
end;

procedure UnLoadAddInPackage(ModuleInstance: HModule);
var
i: integer;
M: TMemoryBasicInformation;
begin
for i := Application.ComponentCount - 1 downto 0 do
begin
VirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
if (ModuleInstance = 0) or (HModule(M.AllocationBase) = ModuleInstance) then
Application.Components[i].Free;
end;
UnRegisterModuleClasses(ModuleInstance);
UnLoadPackage(ModuleInstance);
end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ModuleInstance1 := LoadPackage('P1.bpl');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
frm : TCustomForm;
begin
frm := CreateFormByClassName('TfrmP1F1');
try
frm.ShowModal;
finally
frm.Release;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
UnLoadAddInPackage(ModuleInstance1);
end;

{ P1.bpl }
unit uP1F1;

interface

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

type
TfrmP1F1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

//var
// frmP1F1: TfrmP1F1;

implementation

{$R *.DFM}

initialization
RegisterClass(TfrmP1F1);

finalization
RegisterClass(TfrmP1F1);

end.

編譯後會產生 test.exe 與 P1.bpl ,當兩個檔案在同一目錄下可以正常執行。

若是我想將 P1.bpl 放在一個子目錄時(如 P1 目錄)下只要將主程式中的

ModuleInstance1 := LoadPackage('P1.bpl');

改成

ModuleInstance1 := LoadPackage('P1\P1.bpl');

就可以正常執行了。

------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
系統時間:2024-04-20 5:39:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!