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

package的釋放問題

尚未結案
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-07 19:22:39 IP:202.181.xxx.xxx 未訂閱
請問我在釋放package時主程式畫面居然不見了,請問是為什麼??? function LoadAddinPackage(const PackageID, FileName: string): HMODULE; var ModuleInstance: HMODULE; begin { 檢查package是否已經載入以避免重複載入,重複載入模組只會遞增參考計數 } ModuleInstance := GetModuleHandle(PChar(ExtractFileName(FileName))); if ModuleInstance = 0 then begin ModuleInstance := LoadPackage(FileName); { 已經存在的 package 不要重複加入串列中 } if AddinPackages.IndexOfObject(Pointer(ModuleInstance)) < 0 then AddinPackages.AddObject(UpperCase(PackageID), Pointer(ModuleInstance)); end; Result := ModuleInstance; end; procedure UnloadAddInPackage(ModuleInstance: 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 (ModuleInstance = 0) or (HMODULE(M.AllocationBase) = ModuleInstance) then Application.Components[i].Free; end; UnRegisterModuleClasses(ModuleInstance); UnloadPackage(ModuleInstance); end; procedure UnloadAddinPackage(const PackageID: string); var i: integer; begin i := AddinPackages.IndexOf(UpperCase(PackageID)); if i < 0 then Exit; UnloadAddinPackage(HMODULE(AddinPackages.Objects[i])); { Maintain loaded package list } AddinPackages.Delete(i); end; 我只是使用以上的load和unload而已,執行UnloadAddinPackage(const PackageID: string); 畫面不見
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-08 09:45:33 IP:211.76.xxx.xxx 未訂閱
引言: 請問我在釋放package時主程式畫面居然不見了,請問是為什麼??? function LoadAddinPackage(const PackageID, FileName: string): HMODULE; var ModuleInstance: HMODULE; begin { 檢查package是否已經載入以避免重複載入,重複載入模組只會遞增參考計數 } ModuleInstance := GetModuleHandle(PChar(ExtractFileName(FileName))); if ModuleInstance = 0 then begin ModuleInstance := LoadPackage(FileName); { 已經存在的 package 不要重複加入串列中 } if AddinPackages.IndexOfObject(Pointer(ModuleInstance)) < 0 then AddinPackages.AddObject(UpperCase(PackageID), Pointer(ModuleInstance)); end; Result := ModuleInstance; end; procedure UnloadAddInPackage(ModuleInstance: 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 (ModuleInstance = 0) or (HMODULE(M.AllocationBase) = ModuleInstance) then Application.Components[i].Free; end; UnRegisterModuleClasses(ModuleInstance); UnloadPackage(ModuleInstance); end; procedure UnloadAddinPackage(const PackageID: string); var i: integer; begin i := AddinPackages.IndexOf(UpperCase(PackageID)); if i < 0 then Exit; UnloadAddinPackage(HMODULE(AddinPackages.Objects[i])); { Maintain loaded package list } AddinPackages.Delete(i); end; 我只是使用以上的load和unload而已,執行UnloadAddinPackage(const PackageID: string); 畫面不見
這很正常啊! 而且還會出現 Error 呢! 請注意紅色標示的那行, Delphi 的 Application 中有隱藏一個Form, 您的主程式(MainForm) 又一個, 所以 Application.ComponentCount 的基本消費是 2, 所以您改成如下試試: for i := Application.ComponentCount - 1 downto 2 do
------
將問題盡快結案也是一種禮貌!
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-08 10:48:55 IP:202.181.xxx.xxx 未訂閱
Dear Danny : 我改過就可以了,我有各疑問,為什麼,我看別人的範例程式都沒有修改成版主所說的就可以執行??請問世差別在哪??
mustapha.wang
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-06 10:09:31 IP:218.1.xxx.xxx 未訂閱
如果你没有RegisterClass,那么GetClass可能返回nil,这样会不会以为MainForm也是在你的add in package里面,于是被误杀。 我用的是: VirtualQuery(Application.Components[i].ClassType,M,SizeOf(M)); 你试试看 久病成良医
------
江上何人初见月,江月何年初照人
系統時間:2024-05-20 9:44:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!