- 註冊時間
 - 2006-3-13 
 - 最後登錄
 - 2025-7-23 
 - 在線時間
 - 675 小時 
 - 閱讀權限
 - 200 
 - 積分
 - 417 
 - 帖子
 - 1109 
 - 精華
 - 0 
 - UID
 - 2 
  
 
 
 
    
 | 
如何使用 Runtime Package 
 
By Kingron, 2005-04-21 
 
Answer for bigery 
 
大家都知道使用DLL,非常方便,而 Delphi 提供了 Package 的功能,特别是 Runtime Package,可以使用类似DLL的功能,然而可以比DLL功能更强大和方便,使用Package可以提高模快重用能力! 
 
下面以如何使用一个函数和一个窗体为例,来说明如何使用 Runtime Package。 
 
预计:在 Package 里面,提供一个 Password 对话框窗体,提供一个函数,GetRandString(Len: Integer): string。 
 
首先你建立一个Package,设置Package Options为Run Time Package。  
 
然后New一个Form,设置好Password之类的一些界面的东西。并和DLL一样,编写一个函数,注意需要在Interface部分声明。 
 
然后编写代码,Build生成一个DCP和BPL文件。  
 
接下来编写调用Package的工程。 
 
New一个Project,然后设置Project Options,到Pacages页面中,选中 Build with runtime Packages,把其中不需要的删除!不删除那些默认的也可以,不过你需要带VCL的runtime Package,会很大的,如果不带,你的程序在没有安装Delphi的机器上面无法运行,如果使用Package,你的Package文件(bpl)需要同时发布给客户。 
 
修改好Project Options后,在你的需要使用Package中的单元的地方,在use部分添加package中的单元名即可。以后即可和同工程中的文件一样使用,非常方便。 
 
需要注意的是,使用的时候,由于Package 的Form不会被自动创建的,因此需要你手动创建窗体。如果Package需要给别人使用,需要发布DCP文件,DCP默认在Delphi安装目录下的Project\bpl下。 
 
如果要动态加载Package,使用LoadPackage即可,但是必须在Package里面注册你的Class: 
 
RegisterClass(TForm2); 
UnRegisterClass(TForm2);- // 动态加载Package
 
 - procedure TForm1.Button1Click(Sender: TObject);
 
 - var
 
 -   PackageModule: HModule;
 
 -   AClass: TPersistentClass;
 
 - begin
 
 -   PackageModule := LoadPackage('Package1.bpl');
 
 -   if PackageModule <> 0 then
 
 -   begin
 
 -     AClass := GetClass('TForm2');
 
 -     if AClass <> nil then
 
 -       with TComponentClass(AClass).Create(Application) as TCustomForm do
 
 -       begin
 
 -         ShowModal;
 
 -         Free;
 
 -       end;
 
 -     UnloadPackage(PackageModule);
 
 -   end;
 
 - end;
 
  複製代碼 在你的Package unload前,注意清除所有Package中的类的应用!下面这个过程可以干这个苦力活!- procedure DoUnloadPackage(Module: HModule);
 
 - var
 
 -   i: Integer;
 
 -   M: TMemoryBasicInformation;
 
 - begin
 
 -   { Make sure there aren't any instances of any
 
 -     of the classes from Module instantiated, if
 
 -     so then free them.  (This assumes that the
 
 -     classes are owned by the application) }
 
  
-   for i := Application.ComponentCount - 1 downto 0 do
 
 -   begin
 
 -     VirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
 
 -     if (Module = 0) or
 
 -       (HMODULE(M.AllocationBase) = Module) then
 
 -       Application.Components[i].Free;
 
 -   end;
 
 -   UnRegisterModuleClasses(Module);
 
 -   UnLoadPackage(Module);
 
 - end;
 
  複製代碼 即使使用动态Package,也必须设置调用的工程为Build with runtime Package中包含你的Package,否则GetClass会失败! 
 
附件是一个完整的例子。 |   
 
  
 |