使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 專案中封裝axios封裝iOS
- 在Flutter中封裝redux的使用Flutter封裝Redux
- oci.dll 檔案正在被使用
- win10 64位怎麼安裝dll檔案_win10系統如何安裝dll檔案Win10
- dwmcore.dll 是 Windows 作業系統中的一個動態連結庫檔案,主要用於桌面視窗管理器(DWM)。它負責處理視覺效果和視窗管理,例如透明視窗和縮圖。DLL 檔案載入到 DWM(桌面視窗管理器)程序中的基礎原理如下:Windows作業系統視覺
- Mac雙視窗檔案管理:MaxCommanderMac
- win10如何註冊dll檔案_win10系統dll檔案怎樣安裝Win10
- 使用 Visual Studio 來除錯 dll 檔案除錯
- 專案中封裝的time_util常用的方法封裝
- Depends.exe檢視dll動態鏈檔案
- dll檔案是什麼 dll檔案用什麼軟體開啟
- 全方位解讀DLL檔案—編寫DLL
- 雙視窗檔案管理器Commander One
- 探究:nuget工具對不再使用的dll檔案的處理策略
- .NET中封裝SqlHelper封裝SQL
- dll檔案刪除不了
- win10怎麼刪除dll檔案_win10dll檔案刪除的方法Win10
- Microsoft Visual Studio VS dumpbin使用檢視.obj、.lib、.dll、.exe檔案頭、段函式ROSOBJ函式
- JAVA呼叫C語言下的DLL檔案JavaC語言
- java中呼叫dll檔案的步驟Java
- MapStruct在專案中封裝實踐-帶原始碼Struct封裝原始碼
- plsql developer 視窗的使用SQLDeveloper
- VS 2019 打包安裝檔案 教程 (告訴你為什麼你的是DLL檔案)解決!
- win10系統dll檔案一鍵修復 缺少dll檔案修復方法Win10
- 利用VS(Visual Studio)自帶的工具檢視DLL檔案相關資訊
- WAMP 安裝——缺少檔案(VCRUNTIME140.DLL、API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL、MSVCR110.DLL)API
- WPF中封裝一個自己的MessageBox封裝
- 封裝C專案為dll封裝
- antixss防禦xss DLL庫檔案
- 使用 gdb 檢視 coredump 檔案的 backtrace
- Simulink中封裝子系統封裝
- 電腦丟失dll檔案一鍵修復 win10缺少dll檔案怎麼辦Win10
- C# winForm 視窗跳轉後關閉上一個視窗的方法C#ORM
- vim學習筆記——多檔案、多視窗編輯筆記
- dll應用在win10環境下怎麼使用_win10系統開啟dll檔案的方法Win10
- 如何使用python把json檔案轉換為csv檔案PythonJSON
- dll反編譯(修改引用檔案、修改程式碼)再生成dll編譯
- 在webview_flutter中封裝JSBridgeWebViewFlutter封裝JS
- 使用 Fstransform 轉換檔案系統ORM