DELPHI封装对象到DLL
在Delphi中实现窗体的DLL封装

在Delphi中实现窗体的DLL封装
何定华
【期刊名称】《电脑知识与技术》
【年(卷),期】2010(006)014
【摘要】为了实现函数和其它资源的共享,我们可以在Delphi中将窗体封装到DLL中,窗体的DLL封装对不同程序、不同语言进行资源共享非常有意义.
【总页数】3页(P3636-3637,3648)
【作者】何定华
【作者单位】武汉职业技术学院计算机系,湖北,武汉,430074
【正文语种】中文
【中图分类】TP311
【相关文献】
1.在Delphi中实现基于DLL的软件设计方法 [J], 侯珂;高洪尧
2.Delphi中利用Tbitmap实现窗体图形动态打印 [J], 李建武
3.Delphi窗体中动态组件的实现 [J], 王凤广;毕玉龙
4.基于Delphi的DLL封装系统数据支撑模块技术的研究 [J], 王春红;陈继红
5.Delphi中DLL封装业务逻辑的实现 [J], 盛永生;许楠;周晶楠
因版权原因,仅展示原文概要,查看原文内容请购买。
Delphi制作DLL的方法

Delphi制作DLL的方法一 Dl l的制作一般步骤二参数传递三 DL L的初始化和退出清理[如果需要初始化和退出清理]四全局变量的使用五调用静态载入六调用动态载入七在DLL建立一个TF orM八在DLL中建立一个TMDIC hildF orM九示例:十 Del phi制作的Dll与其他语言的混合编程中常遇问题:十一相关资料一 Dll的制作一般分为以下几步:1在一个DL L工程里写一个过程或函数2写一个Ex ports关键字,在其下写过程的名称。
不用写参数和调用后缀。
二参数传递1参数类型最好与win dow C++的参数类型一致。
不要用DE LPHI的数据类型。
2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。
成功或失败的返回值最好为1[成功]或0[失败].一句话,与wi ndows c++兼容。
3用stdc all声明后缀。
4最好大小写敏感。
5 无须用far调用后缀,那只是为了与w indow s 16位程序兼容。
三D LL的初始化和退出清理[如果需要初始化和退出清理]1 DL LProc[SysU tils单元的一个P ointe r]是DL L的入口。
在此你可用你的函数替换了它的入口。
但你的函数必须符合以下要求[其实就是一个回调函数]。
如下:pro cedur e Dll Enter Point(dwRe ason: DWOR D);fa r;std call;dwRe ason参数有四种类型:DL L_PRO CESS_ATTAC H:进程进入时DL L_PRO CESS_DETAC H:进程退出时DL L_THR EAD_A TTACH :线程进入时DL L_THR EAD_D ETACH :线程退出时在初始化部分写:D LLPro c :=@DLLE nterP oint;Dl lEnte rPoin t(DLL_PROC ESS_A TTACH);2如Form上有Tdc omCon necti on组件,就Uses Acti vex,在初始化时写一句CoI nitia lize(nil);3 在退出时一定保证Dco mConn ectio n.Con necte d :=False,并且数据集已关闭。
delphi封装DLL总结

dwReason参数有四种类型:
DLL_PROCESS_ATTACH:进程进入时
DLL_PROCESS_DETACH进程退出时
DLL_THREAD_ATTACH 线程进入时
DLL_THREAD_DETACH 线程退出时
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure OpenForm(mainForm:TForm);stdcall;External'project2.dll';
procedure ShowCCC;stdcall;External'project2.dll';
六 调用动态载入
1 建立一种过程类型[如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是怎么回事了]。如:
type
mypointer=procedure(form:Tform);Far;external;
var
Hinst:Thandle;
showform:mypointer;
四 全局变量的使用
在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据传递,除非你用内存映像文件。
五 调用静态载入
1 客户端函数声名:
1)大小写敏感。
2)与DLL中的声明一样。
3 用stdcall声明后缀。
Delphi-DLL注入

AdjustTokenPrivileges() :调整进程的权限.
function AdjustTokenPrivileges(
TokenHandle: THandle; // 访问令牌的句柄
DisableAllPrivileges: BOOL; // 决定是进行权限修改还是除能(Disable)所有权限
var
hRemoteProcess, hRemoteThread: THandle;
pszLibFileRemote: Pointer;
pszLibAFilename: PwideChar;
pfnStartAddr: TFNThreadStartRoutine;
memSize, WriteSize, lpThreadId: Cardinal;
OpenProcess():打开目标进程,得到目标进程的操作权限,详细参看MSDN
function OpenProcess(
dwDesiredAccess: DWORD; // 希望获得的访问权限
bInheritHandle: BOOL; // 指明是否希望所获得的句柄可以继承
//结构PreviousState的长度,如果PreviousState为空,该参数应为 0
var PreviousState: TTokenPrivileges;
// 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息
var ReturnLength: DWORD //实际PreviousState结构返回的大小
): Pointer;
WriteProcessMemory():往申请到的空间中写入DLL的文件名
delphi dll 参数

Delphi DLL 参数1. 什么是 Delphi DLL?Delphi是一种基于Object Pascal语言的集成开发环境(IDE),是由Embarcadero Technologies开发的。
Delphi可用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用程序。
Delphi中的DLL(动态链接库)是一种可重用的代码库,可以在不同的应用程序中共享和调用。
2. DLL 的优势使用DLL的主要优势在于代码重用和模块化开发。
通过将代码放入DLL中,我们可以将其用于多个应用程序中,避免重复编写相同的代码。
此外,DLL还提供了一种有效的方式来实现模块化开发,使得应用程序的开发和维护更加简单和可靠。
3. Delphi DLL 的参数在Delphi中,DLL的参数是指在调用DLL函数时传递给函数的值或引用。
参数可以是输入参数、输出参数或输入/输出参数。
下面是一些常见的DLL参数类型:•整数参数:在Delphi中,整数参数可以是Byte、ShortInt、Word、SmallInt、Cardinal、Integer等类型。
这些参数可以用于传递整数值,如计数器、索引等。
•浮点数参数:浮点数参数可以是Single、Double、Extended等类型。
这些参数用于传递浮点数值,如坐标、价格等。
•字符串参数:字符串参数可以是AnsiString、WideString、UnicodeString 等类型。
这些参数用于传递文本信息,如文件路径、用户名等。
•指针参数:指针参数用于传递内存地址,可以是PChar、PByte、PInteger 等类型。
通过指针参数,我们可以在DLL函数内部修改传入的参数值。
•数组参数:数组参数可以是静态数组或动态数组。
通过数组参数,我们可以传递一组相关的值,如图像像素、数据集等。
•记录参数:记录参数可以是自定义的记录类型。
通过记录参数,我们可以传递一组相关的字段值,如学生信息、订单详情等。
Delphi中控制Word,xml,dll等操作

Delphi中控制Word,xml,dll等操作DLL的建立与调用[转]动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。
由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。
同时,DLL还为不同语言间代码共享提供了一条方便的途径。
因而DLL在编程时应用较为广泛,本文将介绍如何在Delphi 中建立和使用DLL。
一.DLL 库内存共享机制从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。
如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。
当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。
DLL则不同,它即使被某个工程调用,编译后仍是独立的。
也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。
并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。
这样便可消除unit带来的相同代码多处占用内存的弊病。
二 Delphi中DLL库的建立在Delphi环境中,编写一个DLL同编写一个一般的应用程序并没有太大的区别。
事实上作为DLL主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。
Delphi动态与静态调用DLL(最好的资料)

Delphi动态与静态调用DLL(最好的资料)摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例。
一、动态链接库的概念动态链接库( Dynamic Link Library ,缩写为 DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。
动态链接库文件的扩展名一般是 dll ,也有可能是 drv 、 sys 和 fon ,它和可执行文件( exe )非常类似,区别在于 DLL 中虽然包含了可执行代码却不能单独执行,而应由 Windows 应用程序直接或间接调用。
动态链接是相对于静态链接而言的。
所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。
换句话说,函数和过程的代码就在程序的 exe 文件中,该文件包含了运行时所需的全部代码。
当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。
而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。
仅当应用程序被装入内存开始运行时,在 Windows 的管理下,才在应用程序与相应的 DLL 之间建立链接关系。
当要执行所调用 DLL 中的函数时,根据链接产生的重定位信息, Windows 才转去执行 DLL 中相应的函数代码。
一般情况下,如果一个应用程序使用了动态链接库, Win32 系统保证内存中只有 DLL 的一份复制品,这是通过内存映射文件实现的。
DLL 首先被调入 Win32 系统的全局堆栈,然后映射到调用这个 DLL 的进程地址空间。
在 Win32 系统中,每个进程拥有自己的 32 位线性地址空间,如果一个 DLL 被多个进程调用,每个进程都会收到该 DLL 的一份映像。
Delphi下DLL调用以及共享数据库连接

p(parameter) //调用Dll.含参数。
else
begin
strpcopy(b,'Method Not Defined: '+modulename+'!');
messagebox(message_parameter.mainhandle,b,
第二种:外部函数引用
做一个单元(unit),引用外部函数。例如:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' name 'mydllpro';
依赖于DLL接口输出方式,或者写成:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' index my_index;
process_cancel_service_form.showmodal;
process_cancel_service_form.free;
end;
(******************************)
exports
run_cancel_service;
begin
b,'Error...',mb_ok or mb_iconexclamation);
end;
end;
说明:如果你有一个dll是这么写的,
library cancel_service;
uses
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用接口避免了将 TCar 在两处声明的难堪,避免了使用 virtual 和 abstract 造成的视觉 混乱,而且接口可以自动管理对象的生命期,避免程序员忘记销毁对象造成的内存泄漏。
总之,使用接口很好的解决了在 DLL 封装对象的局限。
方法三:用 COM/COM+封装对象
Uses ShareMem; …… function CrtCar:TCar; begin
result := TCar.Create; end;
exports CrtCar;
End. 4、 新建一个单元,添加到 DemoDll 项目中,命名为 CarI。代码如下:
unit CarI; interface type
uses ShareMem …… function CrtCar:TCar; begin result:=TCar.Create; end;
exports CrtCar;
5、 在 Frm 单元做以下修改: 添加
TCar = class(TObject) procedure Drive;virtual;abstract;
方法三:用 COM/COM+封装对象..................................................................................................4
方法一:基本封装
原型
原型说明
TForm1 和 TCar 分别在不同的单元当中; TForm1 中有一个按钮 Button1,点击 Button1 执行 TCar.Drive; TForm1 单元 uses 了 TCar 单元; TForm1 的处理过程如下:
var mycar:TCar;
begin mycar:=TCar.Create; mycar.Drive; mycar.Free;
封装 TCar 到 DLL 中
在 DLL 中封装对象的限制
调用 DLL 的应用程序只能使用 DLL 中对象得动态绑定方法。也就是说方法后面必须有 virtual 关键字;
改为 TCar = class(TInterfacedObject,ICar)
6、 Frm 单元代码: procedure TForm1.Button1Click(Sender: TObject); var mycar:ICar; begin mycar:=CrtCar; mycar.Drive; mycar:=nil; end;
方法二:运用接口在 DLL 中封装对象
原型
还是方法一中的原型。
封装步骤
1、 在 Project Manager 中添加新项目 Add New Project,选择 DLL Wizard,命名新项目 为 DemoDll。
2、 将 TCar 添加到 DemoDll 项目中,并在 DemoExe 中删除 Tcar。 3、 在 Library DemoDll 中添加:
end; …… var
function CrtCar:TCar;external 'DemoDll.dll'; 修改
将 mycar:=TCar.Create 改为 mycar:=CrtCar
我们发现,在 TCar 单元中声明了类 TCaபைடு நூலகம்,在 Frm 单元也声明了 TCar,重复声明不是 OO 的正确思想。而且,两处的声明还不太一样,难以理解。
ICar = Interface(IInterface) ['{… …}'] //GUID,按 Ctrl+Shift+g 可以生成 procedure Drive;
end; implementation end. 5、 将 CarT 单元中的 TCar 做一些改变:
将 Tcar = class(TObject)
封装对象的实例只能在 DLL 中创建; 在 DLL 和调用 DLL 的应用程序中都需要对封装对象以及被调用的方法进行声明;
封装步骤
1、 在 Project Manager 中添加新项目 Add New Project,选择 DLL Wizard,命名新项目 为 DemoDll。
2、 将 TCar 单元加入到 DemoDll 项目中,并从原项目 DemoExe 中删除 TCar 单元。 3、 在 TCar 单元做以下修改:在 Drive 方法后面加上 virtual 关键字。 4、 在 Library DemoDll 中做以下修改: 添加
在 Delphi 中封装对象到 DLL
方法一:基本封装.............................................................................................................................1 原型............................................................................................................................................. 1 原型说明..................................................................................................................................... 1 封装 TCar 到 DLL 中.................................................................................................................2 在 DLL 中封装对象的限制...............................................................................................2 封装步骤.............................................................................................................................2