使用DLL檔案中封裝的視窗

來源:互聯網
上載者:User
使用DLL檔案中封裝的視窗徐長友

文章摘要:
     編寫軟體時常常使用到DLL檔案,本文就使用DLL檔案中封裝的視窗來說說Delphi中在DLL如何封裝視窗,如何調用DLL中封裝的視窗,及MDI-Child在DLL中載入並使用

一、在DLL中封裝視窗
    開啟Delphi建立一個DLL工程,儲存為usedll,產生代碼

library usedll;

{ 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 DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes;

{$R *.res}

begin
end.

建立一個表單,添加一個Label和Button,設定如下:

object Form1: TForm1
Left = 192
Top = 133
Width = 334
Height = 221
Caption = 'DLL'#20013#20351#29992#31383#20307
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 104
Top = 80
Width = 80
Height = 13
Caption = 'DLL'#20013#20351#29992#31383#20307
end
object Button1: TButton
Left = 120
Top = 152
Width = 75
Height = 25
Caption = #30830#23450
TabOrder = 0
OnClick = Button1Click
end
end

添加一過程:procedure LoadForm; export;
procedure LoadForm;
begin
Form1 := TForm1.Create(Application);
try
Form1.ShowModal;
finally
Form1.Free;
end;
end;

全部完整的代碼:

library usedll;

uses
SysUtils,
Classes,
Form_Unit in 'Form_Unit.pas' {Form1};

{$R *.res}
exports
LoadForm index 1;
begin

end.

 

unit Form_Unit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ApplicationName: String;
procedure LoadForm(Handle: THandle; AppName: ShortString); export;

implementation

{$R *.dfm}
procedure LoadForm(Handle: THandle; AppName: ShortString);
begin
Application.Handle := Handle;
ApplicationName := AppName;
Form1 := TForm1.Create(Application);
try
Form1.ShowModal;
finally
Form1.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
self.close;
end;

end.

編譯後產生usedll.dll檔案,至此DLL檔案就完成了

二、調用DLL中封裝的視窗

    建立一個工程,添加一個Button,表單布局如下:

object Form1: TForm1
Left = 192
Top = 133
Width = 336
Height = 222
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 128
Top = 88
Width = 75
Height = 25
Caption = #25171#24320#31383#20307
TabOrder = 0
OnClick = Button1Click
end
end

完整的代碼如下:

unit Use_Unit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
procedure LoadForm; external 'usedll.dll' index 1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
LoadForm;
end;

end.

三、MDI-Child在DLL中載入並使用
    如果是MDI-Child又如何在DLL中載入並使用呢,下面就這個問題說說使用DLL檔案中封裝的視窗。
建立一個DLL工程,儲存為mdidll,再建立一個表單,FormStyle設為fsMDIChild,如下:
object Form1: TForm1
Left = 192
Top = 133
Width = 344
Height = 234
Caption = 'MDI'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsMDIChild
OldCreateOrder = False
Position = poDefault
Visible = True
OnClose = FormClose
PixelsPerInch = 96
TextHeight = 13
end

代碼如下:

unit mdi_Unit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
MyParentForm: TForm;
MyParentApplication: TApplication;
end;

var
DllApplication: TApplication;
implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

end.

library mdidll;

uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
mdi_Unit in 'mdi_Unit.pas' {Form1};

procedure LoadChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
var
Form1: TForm1;
DllProc: Pointer;

begin
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
Form1.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

{$R *.res}
exports
LoadChild;
begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.

編譯後產生mdidll.dll檔案。
使用DLL中的MDI-Child視窗如下:

    建立一個工程,主視窗設定如下FormStyle設為fsMDIForm:
object Form1: TForm1
Left = 192
Top = 133
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsMDIForm
Menu = MainMenu1
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object MainMenu1: TMainMenu
Left = 72
Top = 136
object N1: TMenuItem
Caption = #26032#24314'(&N)'
OnClick = N1Click
end
end
end
代碼:

unit usemdi_Unit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.N1Click(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
begin
DllHandle := LoadLibrary('mdidll');
ProcAddr := GetProcAddress(DllHandle, 'LoadChild');
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
end;
end;

end.

結束語:
    到這裡你應該會用Delphi調用DLL檔案中封裝的視窗了吧,如果還有不明白的話請與我聯絡(首頁: http://yousoft.home.chinaren.com ,郵箱:yousoft@chinaren.com)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.