调用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:[email protected];          //变量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.

到此为止,结束。

好文要顶 关注我 收藏该文

原文地址:https://www.cnblogs.com/westsoft/p/8504129.html

时间: 2024-11-02 15:33:50

调用DLL窗体-Delphi实例的相关文章

C++ 生成 dll 和调用 dll 的方法实例(转)

1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#else#define EXPORT __declspec(dllimport)#endif extern "C"{EXPORT void example(void);... ...} xxx.cpp内容如下: #define BUILD_XXX_DLL#include "xxx.

delphi 基础之三 编写和调用dll文件

delphi 编写和调用dll文件   Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几种情况下,调用DLL 是合理的: 1) 不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销. 2) 当某些内容需要升级的时候,如果使用DLL 只需要改变DLL 就可以了,而不需要把整个程序都进行变动. 3) 由于DLL 是独立于语言的,所以,当不同语言习惯的人共同开

在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll

  调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton;

调用Dll里面的窗体

将窗体资源分装到DLL中并且调用 用Delphi生成DLL并封装窗体的示例 调用Dll里面的窗体 DLL文件 library Project2; { Important note about DLL memory management: ShareMem must be the  first unit in your library's USES clause AND your project's (select  Project-View Source) USES clause if your

delphi编写与调用DLL(delphi7下测试通过)

http://blog.sina.com.cn/s/blog_4dbbf76f01000anz.html 1 delphi编写DLL 2 下面在delphi中编写一个简单的dll,在该dll中只有一个max函数,返回2个数中的大数(Delphi 5.0) 3 1.New->DLL;取名为DLL_0001,编写代码: 4 library dll_0001; 5 uses 6 SysUtils, 7 Classes; 8 {$R *.RES} 9 function max(x,y:integer):

Delphi调用Dll的的2种写法

unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;//定义类型要与原函数一样function GetUserDefaultUILanguage():Integer;external 'Kernel32.DLL'; type  TForm1 = class(TForm)    Button1: TButto

delphi编写与调用DLL

delphi编写DLL 下面在delphi中编写一个简单的dll,在该dll中只有一个max函数,返回2个数中的大数(Delphi 5.0) 1.New->DLL;取名为DLL_0001,编写代码: library dll_0001; uses  SysUtils,  Classes; {$R *.RES} function max(x,y:integer):integer;stdcall;begin    if(x>y) then     max :=x     else     max :

c++/c语言中如何调用DLL

参考网站如下: ?http://blog.csdn.net/yusongwhu/article/details/7577461 http://www.cnblogs.com/lhbssc/archive/2012/02/08/2342853.html 具体内容如下: (1)篇? 今天在研究怎么在vc中调用动态dll的问题,看了一个下午,总算有些眉目. 首先来说说调用的原理: 调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同

C#程序实现动态调用DLL的研究(转)

摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动