用DLL方式封装MDI子窗体

穿棉袄吃雪糕糕

穿棉袄吃雪糕糕

2016-02-19 19:58

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享用DLL方式封装MDI子窗体教程,希望对大家能有一点小小的帮助。

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

开发人员可以负责某一个模块的编写包括(界面+逻辑),可以互不干扰,模块开发完成后,主程序统一调用。 易于程序升级,当程序升级时,不用编译主exe文件,更新某个DLL就可以升级。 可以根据客户不同的需求、价钱给他们不同的模块。(奸商都愿意用这招)

  最近用到这个技术,因为小弟没有用过,在网上google了一下,对它有了了解,我用的是基于COM的DLL,下面总结如下:

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

你的DLL中的接口要有两个参数:第一,主程序的Application对象;第二,主程序窗体对象; 你要重写DLL入口函数 如果是基于COM的,要注意:因为COM没有TApplication和TForm类型,你在传入时需要强转为Integer。

  需要注意的就这么多,下面结合例子看看(假设你已经建立了工程):

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

    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方法的实现:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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子窗体,当然你要在子窗体上进行比如:数据库的操作,还要有更丰富的界面,肯定会遇到各种问题。以后总结了再说吧!^_^

展开更多 50%)
分享

猜你喜欢

用DLL方式封装MDI子窗体

编程语言 网络编程
用DLL方式封装MDI子窗体

[初学VB.NET]如何防止重复打开MDI子窗体

电脑网络
[初学VB.NET]如何防止重复打开MDI子窗体

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

只允许建立一次子窗体的MDI程序

编程语言 网络编程
只允许建立一次子窗体的MDI程序

用VB将ASP代码封装成DLL

ASP
用VB将ASP代码封装成DLL

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

用VB生成DLL封装ASP代码连接数据库

Web开发
用VB生成DLL封装ASP代码连接数据库

用VB生成DLL封装ASP代码 连接数据库

ASP
用VB生成DLL封装ASP代码 连接数据库

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win8触屏操作更高效

Win8触屏操作更高效

几个delphi书中没提过的数据库问题与我的疑惑和心得(一起讨论)

几个delphi书中没提过的数据库问题与我的疑惑和心得(一起讨论)
下拉加载更多内容 ↓