rt:请教:如何利用“包”来分割庞大的应用程序???分多用不完了,再送100分

解决方案 »

  1.   

    在利用installshield打包时,在disk builder时选择disk的大小,然后在打包时他会把你的程序打成(你的打包程序总大小/你选择的disk的大小)个包
      

  2.   

    如 何 使 用 Delphi 開 發 大 型 主 從 架 構 系 統 - Package 的 秘 密 和 威 力 (續)到 這 裡 為 止 我 們 只 是 證 明 了 使 用 資 料 模 組 Package可 以 讓 應 用 程 式正 確 的 執 行 , 但 是 主 程式 啟 動 的 時 間 和 一 般 獨 立 的 EXE 沒 有 什 麼 不 同 。 但 是 接 下 來 的 情 形 就 比 較 有 趣 了 。 因 為 我 們 要 藉 由 接 下 來 的 程 式 碼 來 證 明 使 用 Package 可 以 大 幅 加 快 子 系 統 的 載 入 速 度 。在 主 表 格 中 有 一 個 按 鈕 『載 入 第 二 個 UI Package』 。 這 個 按 鈕 的 功 能 就 是 模 擬 載 入 子 系 統 的 功 能 。 當 使 用 者 點 選 這 個 按 鈕 之 後 , 範 例 程 式 會 載 入 另 外 一 個 只 有 使 用 者 介 面 的Package , 而 且 這 個 Package 必 須 再 使 用 剛 才 載 入 的 資 料 模 組Package 來 顯 示 資 料 。 藉 由 這 個 模 擬 的 子 系 統 功 能 , 我 們 要 證 明 資 料 模 組 Package 可 以 在 不 同 的 模 組 中 共 用 而 且 可 以 加 快 模 組 啟 動 的 時 間 。這 個 按 鈕 的 OnClick 事 件 處 理 函 數 和 主 表 格 的 FormActvate 事 件 處 理 函 數 非 常 的 類 似 , 它 也 是 呼 叫 LoadUIPackage 程 序 以 便 載 入 一 個 使 用 者 介 面 Package 。procedure TMainForm.Button1Click(Sender: TObject);
    begin 
    LoadUIPackage;end;
     LoadUIPackage 和 LoaddbPackage 幾 乎 一 模 一 樣 , 它 也 是 呼 叫Delphi 的 LoadPackage 和 GetClass 載 入 Package , 取 得 使 用 者 介 面 表 格 的 Meta-Class , 建 立 使 用 者 介 面 表 格 物件 , 搜 尋 資 料 模 組 中 的 Query 元 件 , 然 後 顯 示 資 料 庫 的 資 料 。procedure TMainForm.LoadUIPackage;
    begin 
    //我們必須載入使用者介面Package以便連結到資料庫
    tryUIConnect := LoadPackage(UIPackages);
    LoadUIModule;excepton E : Exception do
    beginMessageBeep(Word(-1));
    ShowMessage(E.Message);
    Application.Terminate;end;end;end;procedure TMainForm.LoadUIModule;
    variCounter : Integer;
    aDS : TDataSource;begin{ Note that TApplication "owns" this form and thus it must be freed prior
    to unloading the package }
    pkgModuleClass := GetClass('TUIPackageForm');
    if pkgModuleClass <> nil then
    beginaPkgForm := TCustomForm(TComponentClass(pkgModuleClass).Create (Application));
    for iCounter := 0 to aPkgForm.ComponentCount - 1 do
    beginif UpperCase(aPkgForm.Components[iCounter].ClassName) = 'TDATASOURCE' then
    beginaDS := TDataSource(aPkgForm.Components[iCounter]);
    aDS.DataSet := aQuery;
    break;end;end;
    aPkgForm.Visible := True;end;end;
     當 我 們 完 成 載 入 使 用 者 介 面 Package 的 功 能 , 再 執 行 範 例 程 式 並 且 按 下 『載 入 第 二 個 UI Package』 按 鈕 之 後 , 可 以 看 到 類 似 圖 九 的 畫 面 。
    圖 九 第 二 個 使 用 者 介 面 Package 啟 動 的 畫 面令 人 驚 訝 的 是 , 使 用 者 介 面 Package 之 中 的 表 格 會 立 刻 的 顯 示 出 來 , 幾 乎 完 全 不 需 要 等 待 。 表 格 一 是 我 使 用 這 個 範 例 程 式 和 使 用 二 個 獨 立 的 EXE 應 用 程 式 比 較 的 結 果 。 從 表 格 中 你 可 以 看 到 使 用Package 載 入 子 系 統 比 使 用 EXE 載 入 子 系 統 整 整 快 了 十 倍 。  使 用 獨 立 的EXE 應 用 程 式 使 用EXE 加Package 的 功 能 
    主 程 式 啟 動 時 間 20 20 
    其 餘 模 組 啟 動 時 間 20 2 表 格 一 獨 立 的 EXE 和 使 用 Package 的 EXE 執 行 的 效 率 比 較
    圖十 使 用Package 的 應 用 程 式 和 一 般 應 用 程 式 執 行 效 率 的 比 較從 上 面 的 結 果 我 們 就 可 以 知 道 使 用 Package 的 好 處 , 它 不 但 可 以 讓 我 們 共 用 資 源 , 也 能 夠 改 善 子系 統 啟 動 的 時 間 。當 然 應 用 程 式 在 使 用 完 畢 之 後 , 它 必 須 釋 放 動 態 載 入 的 Package 以 便 釋 放 系 統 資 源 。 在 主 表 格 的 FormClose 事 件 處 理 函 數 中 它 呼 叫 了 UnLoadAddInPackage 程 序 並 且 傳 遞 Package 的 handle 值 做 為 參 數 以 便 釋 放 Package 。procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin 
    UnLoadAddInPackage(dbConnect);
    UnLoadAddInPackage(UIConnect);end;
     UnLoadAddInPackage 先 從 全 域 物 件 Application 中 找 到 載 入 的 資 料 模 組 和 使 用 者 介 面 表 格 , 先 釋 放 這 些 動態 載 入 , 建 立 的 物 件 , 切 斷 它 們 和Application 和 關 係 , 再 利 用 Package 的 handle 值 解 除 Package 對 Windows 的 註冊 , 最 後 再 呼 叫 UnLoadPackage 釋 放 載 入 到 記 憶 體 之 中 的 Package 。procedure UnLoadAddInPackage(Module: THandle);
    var 
    i: Integer;
    M: TMemoryBasicInformation;beginfor i := Application.ComponentCount - 1 downto 0 do
    beginVirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
    if (Module = 0) or (HMODULE(M.AllocationBase) = Module) then
    beginShowMessage(Application.Components[i].ClassName);
    Application.Components[i].Free;end;end;
    UnRegisterModuleClasses(Module);
    UnLoadPackage(Module);end;
     當 你 結 束 主 程 式 時 , 你 應 該 會 看 到 類 似 圖 十 一 和圖 十 二 的 畫 面 。 這 些 畫 面 證 明 了 當 主 程 式 結 束 時 , 它 能 夠 正 確 的 釋 放 所 有 載 入 的 Package 以 釋 放 系 統 資 源 。
    圖 十 一 範 例 程 式 結 束 時 顯 示 它 正 確 的 釋 放 了 所 有 使 用 的 Package
    圖 十 二 範 例 程 式 正 確 的 釋 放 了 公 用 的 資 料 模 組 Package上 面 的 範 例 程 式 證 明 了 使 用 Package 的 確 能 夠 公 用 Package 以 及 Package 之 中 的 全 域 資 料 , 此 外 也 能 夠 幫 助 子 系 統 加 快 載 入 和 啟 動 的 時 間 。 但 是 主 程 式 在 啟 動 時 仍 然 需 要 載 入 資 料 模 組 Package , 連 結 資 料 庫 。 但 是 對 於 許 多 的 使 用 者 而 言 , 他 們 仍 然 會 希 望 讓 主 程 式 也 能 夠 很 快 的 出 現 。 要 達 成 這 個 目 標 , 你 還 需 要 藉 助 Delphi 執 行 緒 的 能 力 。
      

  3.   

    用INSTALLER设置安装包的大小就可以了