zoukankan      html  css  js  c++  java
  • 用DLL方式封装MDI子窗体

    DLL方式封装MDI子窗体是一种常用的软件开发技术,它的优点:

    人员可以负责某一个模块的编写包括(界面+逻辑),可以互不干扰,模块开发完成后,主程序统一调用。
    程序升级,当程序升级时,不用编译主exe文件,更新某个DLL就可以升级。可以根据客户不同的需求、价钱给他们不同的模块。(奸商都愿意用这招) 用到这个技术,因为小弟没有用过,在网上google了一下,对它有了了解,我用的是基于COM的DLL,下面总结如下:

    想在DLL中封装MDI子窗体,要注意以下几点:

    你的DLL中的接口要有两个参数:
         第一,主程序的Application对象;
         第二,主程序窗体对象;你要重写DLL入口函数,如果是基于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; 保留pplication
    DLLProc = @DLLUnloadProc; 将重写后的入口函数地址付给DLLProc


    这样就实现了DLL封装MDI子窗体,当然你要在子窗体上进行比如:数据库的操作,还要有更丰富的界面,肯定会遇到各种问题。以后总结了再说吧!^_^
  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/sonicit/p/797780.html
Copyright © 2011-2022 走看看