使用DLL檔案中封裝的視窗 (轉)
使用DLL中封裝的視窗
徐長友文章摘要:
編寫時常常使用到DLL檔案,本文就使用DLL檔案中封裝的視窗來說說中在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 (
Project-View ) 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,設定如下:
Form1: TForm1Left = 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
LoadFoindex 1;
begin
end.
unit Form_Unit;
interface
uses
, 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: TForm1Left = 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: Froc;
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檔案中封裝的視窗了吧,如果還有不明白的話請與我聯絡(主頁: ,:to:yousoft@chinaren.com">yousoft@chinaren.com)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007844/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DLL檔案中Form的使用 (轉)ORM
- 在Flutter中封裝redux的使用Flutter封裝Redux
- 專案中封裝axios封裝iOS
- vim 多視窗 多檔案
- 奇怪的DLL檔案解決安裝Windows2000(轉)Windows
- 在ASP檔案中呼叫DLL (轉)
- DLL檔案在Delphi的建立及呼叫 (轉)
- oci.dll 檔案正在被使用
- dwmcore.dll 是 Windows 作業系統中的一個動態連結庫檔案,主要用於桌面視窗管理器(DWM)。它負責處理視覺效果和視窗管理,例如透明視窗和縮圖。DLL 檔案載入到 DWM(桌面視窗管理器)程序中的基礎原理如下:Windows作業系統視覺
- win10 64位怎麼安裝dll檔案_win10系統如何安裝dll檔案Win10
- Depends.exe檢視dll動態鏈檔案
- win10如何註冊dll檔案_win10系統dll檔案怎樣安裝Win10
- Mac雙視窗檔案管理:MaxCommanderMac
- BaseActivity中封裝通用的Toolbar封裝
- .NET中封裝SqlHelper封裝SQL
- 批處理檔案(bat檔案)註冊dll批量註冊dllBAT
- 使用ISO檔案安裝Linux(轉)Linux
- 全方位解讀DLL檔案—編寫DLL
- dll檔案是什麼 dll檔案用什麼軟體開啟
- 探究:nuget工具對不再使用的dll檔案的處理策略
- dll檔案刪除不了
- 追捕檔案WRY.DLL的淺顯分析及程式示例 (轉)
- 使用 Visual Studio 來除錯 dll 檔案除錯
- 雙視窗檔案管理器Commander One
- plsql developer 視窗的使用SQLDeveloper
- win10怎麼刪除dll檔案_win10dll檔案刪除的方法Win10
- 非視窗類中使用定時器的方法 (轉)定時器
- [轉] 從 dll 程式集中動態載入窗體
- 在VB中使用API關閉視窗 (轉)API
- java中呼叫dll檔案的步驟Java
- JAVA呼叫C語言下的DLL檔案JavaC語言
- 工作列視窗以及其子視窗結構 (轉)
- JavaScript視窗功能指南之操縱視窗 (轉)JavaScript
- MapStruct在專案中封裝實踐-帶原始碼Struct封裝原始碼
- 用DEF檔案從DLL中匯出C++類 (轉)C++
- 非視窗類中使用定時器的方法(一) (轉)定時器
- J2ME:clip視窗可使用anchor--轉(轉)
- win10系統dll檔案一鍵修復 缺少dll檔案修復方法Win10