如何干净使用Package架构系统 |
|
mustapha.wang
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
问题缘起:
客户嫌分发客户端麻烦,要用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一起退出了!
------
江上何人初见月,江月何年初照人 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |