• 调用DLL窗体-Delphi实例


    (一)通过向导DLL Wizard新建一个动态链接库,取名为:DLLPro.dpr。说明:当在DLL工程文件中使用了String类型时,要有 uses ShareMem ,不过建议使用PChar类型。其代码如下:
    
    library DLLPro;            //编译生成DLLPro.dll文件。
    
    uses
    ActiveX,
    Forms,
    Windows,
    SysUtils,
    Classes,
    DLLUnt in 'DLLUnt.pas';
    
    {$R *.res}
    
    var
          DllApp:TApplication;    //全局变量DLLApp默认初始化,即,DLLApp:=Application.
    
    procedure CreateForm1(app:TApplication;parentform: TForm); export;stdcall; 
    var
    Form1: TForm1; 
    begin
    CoInitialize(nil); 
    try
        Application:=app;
        Form1:=Tform1.Create(parentform);
        form1.MyParentForm:= parentform;         //MyParentForm在DLLUnt.pas中定义为公共变量
        form1.myparentApplication:=app;            //MyParentApplication在DLLUnt.pas中定义为公共变量
    
        Form1.Show;
        finally
          CoUninitialize;
        end;
    end;
    
     
    
    procedure ExitDll(Reason:Integer);
    begin
    if Reason = DLL_PROCESS_DETACH then                // DLL_PROCESS_DETACH值在DLL死亡时执行。
    begin
        Application:=DllApp;
    end;
    end;
    
     
    
    exports 
    CreateForm1;
    
    begin 
    DllApp:=Application;       //该语句可以省略。
    DllProc:=@ExitDll;          //变量DllProc是SysUtils单元的一个Pointer类型的变量。
    end.
    
    <===============================================================================>
    
    (二)创建DLL(动态链接库)的单元文件,取名为:DLLUnt.pas,该单元文件有与其配套的窗体文件DLLUnt.dfm;有一个ADOConnection1组件,必须定义在TForm1类中,否则编译时出错:Access Violence其部分代码如下:
    
    unit DLLUnt;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, StdCtrls, Buttons,ADODB,DB;
    
    type
    TForm1 = class(TForm)
        Panel0: TPanel;
        GroupBox1: TGroupBox;
        Panel1: TPanel;
        Panel2: TPanel;
    
       ………………
    
        CheckBox891: TCheckBox;
        Edit1: TEdit;
        SpeedButton1: TSpeedButton;
        ADOConnection1: TADOConnection;
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure SpeedButton1Click(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
        MyParentForm: TForm;
        MyParentApplication: TApplication;
    end;
    
    var
    Form1: TForm1;
    
    implementation
    
    
    {$R *.dfm}
    
    ………………
    
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
       query:TADOquery;
       Count,I,RedNum,J,CheckNum:integer;
       RedName,LabName:string;
    begin
    if (edit1.Text='')or(length(edit1.Text)<7)or(StrToFloat(edit1.Text)<2008001) then
    begin
    showmessage('Error');
    exit;
    end;
    query:=Tadoquery.Create(nil);
    query.Connection:=ADOConnection1;
    query.Close;
    query.SQL.Clear;
    query.SQL.Add('select * from gyWinNum where Id>='+quotedStr(edit1.Text)+' order by Id ');
    query.Open;
    Count:=1;
    CheckNum:=0;
    while (Not query.Eof)and(Count<28)   do
    
    ………………
    
    end.
    
    <===============================================================================>
    
    (三)创建项目主窗体的工程文件,取名:MainForm.dpr,其代码如下:
    
    program MainPro;               //编译生成MainPro.exe文件。
    
    uses
    Forms,
    MainUnt in 'MainUnt.pas' {MainForm};
    
    {$R *.res}
    
    begin
    Application.Initialize;
    Application.CreateForm(TMainForm, MainForm);
    Application.Run;
    end.
    
    <================================================================================>
    
    (四)创建项目主窗体的单元文件,取名:MainUnt.pas,其代码如下:
    
    unit MainUnt;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls,ADODB;                 //由于被调文件DLLPro.dll中含义数据集控件,在这里必须要有声明。
    
    type
    TMainForm = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
       
    private
        { Private declarations }
    public
        { Public declarations }
    end;
    
    var
    MainForm: TMainForm;
    
    implementation
    {$R *.dfm}
    
    procedure CreateForm1(app: TApplication;parentform: TForm);stdcall; external'DLLPro.dll';
    
    
    procedure TMainForm.Button1Click(Sender: TObject);
    begin 
          CreateForm1(Application,self); 
    end;
    
    end.
    
    <================================================================================>
    
    另外:创建项目主窗体的单元文件,取名:MainUnt.pas,其代码也可以如下:
    
    unit MainUnt;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls,adodb;
    
    type
    TMainForm = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
       
    private
        { Private declarations }
    public
        { Public declarations }
    end;
    T_CreateForm1=procedure(app: TApplication;parentform: TForm);stdcall;     //定义T_CreateForm1类型
    
    var
    MainForm: TMainForm;
    
    implementation
    {$R *.dfm}
    
    procedure TMainForm.Button1Click(Sender: TObject);
    var
    dllHandle: THandle;
    Procaddr: FarProc;
    CreateForm1: T_CreateForm1;
    begin
        dllHandle:=LoadLibrary('DLLPro');
        Procaddr:=GetProcAddress(dllHandle,'CreateForm1');
        if Procaddr <> nil then
        begin
          CreateForm1:=procaddr;                      //过程名,标识它的入口地址,是过程指针。
          CreateForm1(Application,self); 
        end;
    end;
    
    end.
    
    到此为止,结束。
    
     
     
     
    好文要顶 关注我 收藏该文
     
  • 相关阅读:
    js,vue.js一些方法的总结
    confirm提示弹出确定和取消按钮
    移动端 meta 必备
    Vue.js总结 [2017.6.5]
    2017.6.5项目总结(移动端touch事件)
    微信公众平台接口开发(全面认识接口)
    数据库作业
    数据库子函数等
    判断一年是否为闰年
    数据库练习
  • 原文地址:https://www.cnblogs.com/westsoft/p/8504129.html
Copyright © 2020-2023  润新知