bpl 使用之我見
作者:陳曉兵 lead001@126.com, lead@people.com.cn
寫在前面
在此不再贅述bpl與dll的比較,只介紹bpl的動態調用。
及實現部分的完整性,
開始---------------------------------------->
實現過程
<第一部分 接口單元>
創建一個接口單元
{$WEAKPACKAGEUNIT}
unit uInterface;
interface
uses
Classes, Forms;
type
TBaseClss = class(TComponent)
function CreateForm:TForm; virtual; stdcall;abstract;
...
end;
implementation
{ TBaseClss }
end.
<第二部分 調用的主程序>
選項設置
Project -> Options -> Packages : Runtime Packages
將Build with Runtime Packages複選框選中;
引用uInterface單元
調用過程
function LoadPacket(Fbpl, FClass: String): Boolean;
var
FForm : TForm;
FPersistentClass: TPersistentClass;
FBaseClss : TBaseClss;
H: HMODULE;
begin
try
try
H := 0;
H := LoadPackage(Fbpl);
FPersistentClass := FindClass(FClass);
if FPersistentClass <> nil then
begin
FBaseClss :=
TBaseClss(TComponentClass(FPersistentClass).Create(Application));
FForm := nil;
FForm := FBaseClss.CreateForm;
FBaseClss.Free;
FBaseClss := nil;
FPersistentClass := nil;
if Assigned(FForm) then
begin
FForm.ShowModal;
FreeAndNil(FForm);
end;
end;
except
Application.MessageBox('此功能未安裝', '提示', MB_OK +
MB_ICONINFORMATION);
end;
finally
if H <> 0 then
begin
UnloadPackage(H);
H := 0;
end;
end;
end;
<第三部分 創建bpl包>
創建包
引用uInterface單元
創建接口類,實現TBaseClss
TTestClass = class(TBaseClss)
function CreateForm:TForm; override;
...
end;
function TTestClass.CreateForm: TForm;
var
Form2: TForm2;
begin
Form2 := TForm2.Create(Application);
if Assigned(Form2) then
Result := Form2
else
Result := nil;
end;
注冊類
initialization
RegisterClass(TTestClass);
UnRegisterClass(TBaseClss);
反注冊類
finalization
UnRegisterClass(TTestClass);
----------------------------------------結束>