線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1275
推到 Plurk!
推到 Facebook!

如何干净使用Package架构系统

 
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-21 17:47:13 IP:218.1.xxx.xxx 未訂閱
问题缘起: 客户嫌分发客户端麻烦,要用IE界面,那我就很快的把window界面直接转成ActiveForm了。先做了最简单的ActiveForm,用Package编译,只用到了rtl70/vcl70/vclie70/dbrtl70和自己的公用bpl,使它尽量小;主程序也包成一个bpl,Ocx下载完成,建立ActiveForm时,第一次启动自动更新画面,把主程序运行需要的所有bpl再下载下来。 用户点击“运行”按钮,载入主程序bpl,找到MainForm的Class,创建出MDI的MainForm    问题是,主程序退出时,光卸载主程序的bpl还不行,因为它载入时会载入很多的bpl,如vclx70,vcljpg70,vclsmp70.....包括一些我们自己系统的bpl,它们有的不会自动卸载,也就是说,主程序退出时(ActiveForm还在),系统没有恢复到初始的状态(只有5个bpl)。如果用户再按“运行”,就不能保证有前一次一样的执行行为。    如何干净卸载bpl呢? 我在ActiveForm创建时,先纪录下此时的bpl,
function EnumModule_Proc(HInstance: Longint; Data: Pointer): Boolean;
var
  ModuleFileName:array[1..255] of Char;
begin
  Result:=true;
  FillChar(ModuleFileName,255,#0);
  GetModuleFileName(HInstance,@ModuleFileName,255);
  if AnsiCompareText(ExtractFileExt(StrPas(@ModuleFileName)),'.bpl')=0 then
  begin
    TStrings(Data).Add(StrPas(@ModuleFileName));
  end;
end;    constructor TAcroprise_eMax.Create(AOwner: TComponent);
var
  i:integer;
begin
  inherited;
  FOldBpls:=TStringList.Create;
  EnumModules(EnumModule_Proc,FOldBpls);
  FOldBpls.Sort;
然后在退出主程序时,卸载掉所有非初始的bpl:
procedure TAcroprise_eMax.ReleaseElsePackages;
var
  AList:TStringList;
  i,Index:integer;
  MH:HMODULE;
begin
  AList:=TStringList.Create;
  try
    EnumModules(EnumModule_Proc,AList);
    for i:=AList.Count-1 downto 0 do
      if FOldBpls.Find(AList[i],Index) then
        AList.Delete(i);
    while AList.Count>0 do
    begin
      MH:=GetModuleHandle(PChar(AList[0]));
      while MH>0 do
      begin
        UnLoadPackage(MH);
        MH:=GetModuleHandle(PChar(AList[0]));
      end;
      AList.Delete(0);
    end;
  finally
    AList.Free;
  end;
end;
但不幸的是,整个IE一起退出了!为什么呢? 由于别的 class="code"> constructor TAcroprise_eMax.Create(AOwner: TComponent); var i:integer; begin inherited; FOldBpls:=TStringList.Create; EnumModules(EnumModule_Proc,FOldBpls); FOldBpls.Sort; for i:=0 to FOldBpls.Count-1 do LoadPackage(FOldBpls[i]); end; 诶,IE真的没有退出了。 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
系統時間:2024-07-04 5:14:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!