国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用DLL方式封裝MDI子窗體

2019-11-18 17:59:39
字體:
來源:轉載
供稿:網友

用DLL方式封裝MDI子窗體是一種常用的軟件開發技術,它的優點:

  1. 開發人員可以負責某一個模塊的編寫包括(界面+邏輯),可以互不干擾,模塊開發完成后,主程序統一調用。
  2. 易于程序升級,當程序升級時,不用編譯主exe文件,更新某個DLL就可以升級。
  3. 可以根據客戶不同的需求、價錢給他們不同的模塊。(奸商都愿意用這招)

最近用到這個技術,因為小弟沒有用過,在網上google了一下,對它有了了解,我用的是基于COM的DLL,下面總結如下:

想在DLL中封裝MDI子窗體,要注意以下幾點:

  1. 你的DLL中的接口要有兩個參數:第一,主程序的application對象;第二,主程序窗體對象;
  2. 你要重寫DLL入口函數
  3. 如果是基于COM的,要注意:因為COM沒有TApplication和TForm類型,你在傳入時需要強轉為Integer。

需要注意的就這么多,下面結合例子看看(假設你已經建立了工程):

  TComDllTest1 = class(TAutoObject, IComDllTest1)
  PRivate
    FMsgStr: WideString;
    function GetMDIForm(AForm: TForm): boolean;
  protected
    { Protected declarations }
    function Get_MsgStr: WideString; safecall;
    procedure Set_MsgStr(const Value: WideString); safecall;
    procedure ShowMsgStr; safecall;
    procedure CreateForm(AHandle: SYSUINT); safecall;
    procedure CreateMdiForm(var AApp; AForm: SYSINT); safecall;    //創建MDI窗體 SYSINT為unsigned int
    procedure CreateComTest(AForm: SYSUINT); safecall;
  public
    constructor Create(AForm: SYSINT);
  end;

這是CreateMdiForm方法的實現:

procedure TComDllTest1.CreateMdiForm(var AApp; AForm: SYSINT);
var
  app: TApplication;
  af: TForm;

begin
  app := TApplication(AApp);               //將傳進來的Application對象強轉
  af := TForm(AForm);                           //將傳進來的Form對象強轉

  Application := app;                             //將主程序的application付給COM工程的application對象

  if not GetMDIForm(Form1) then        //GetMDIForm 是判斷窗體是否已經創建
  begin
    Form1 := TForm1.Create(af);        //創建子窗體
  Form1.FormStyle := fsMDIChild;
  Form1.Show;
  end;
end;

最后一步也是最關鍵的就是重寫DLL入口函數,如果不重寫,關閉主窗體時會報地址錯誤,我就吃過這虧(我汗......),在DLL工程文件中寫:

procedure DLLUnloadProc(Reason: Integer); register;
begin
 if (Reason = DLL_PROCESS_DETACH) or (Reason = DLL_THREAD_DETACH) then Application := DLLApp;                           //DLLApp是在DLL工程文件中定義的全局TApplication對象
                                          //用來保存Application對象
end;

在DLL初始化的位置加入:

   DLLApp:=Application;                                 //保留Application
   DLLProc := @DLLUnloadProc;                //將重寫后的入口函數地址付給DLLProc

這樣就實現了DLL封裝MDI子窗體,當然你要在子窗體上進行比如:數據庫的操作,還要有更豐富的界面,肯定會遇到各種問題。以后總結了再說吧!^_^


上一篇:如何通過程序實現網卡的啟用和禁止功能?

下一篇:url編碼與解碼工具附代碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 楚雄市| 腾冲县| 福安市| 江口县| 视频| 曲水县| 博野县| 泊头市| 娄烦县| 固始县| 米林县| 榆社县| 峨边| 海晏县| 布拖县| 若尔盖县| 乐清市| 凤冈县| 贵州省| 洪雅县| 奉新县| 双桥区| 龙泉市| 沈丘县| 伊通| 汾西县| 南京市| 红原县| 壤塘县| 大关县| 沅江市| 枞阳县| 浮梁县| 甘肃省| 黑水县| 宣威市| 南召县| 开阳县| 伊川县| 堆龙德庆县| 鲁山县|