package的釋放問題 |
尚未結案
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
請問我在釋放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 發送簡訊給我 |
引言: 請問我在釋放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 發送簡訊給我 |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |