Delphi中高级DLL的编写和调用
来源:互联网 发布:李佳璇 tensorflow 编辑:程序博客网 时间:2024/04/30 00:45
======================================================
注:本文源代码点此下载
======================================================
delphi中高级dll的编写和调用(1)
根据delphi提供的有关 dll编写和调用的帮助信息,你可以很快完成一般的 dll编写和调用的 应用程序。本文介绍的主题是如何编写和调用能够传递各种参数(包括对象实例)的 dll。例如, 主叫程序传递给 dll一个adoconnection 对象示例作为参数, dll中的函数和过程调用通过该对象 实例访问数据库。
需要明确一些基本概念。对于 dll,需要在主程序中包含 exports子句,用于向外界提供调用 接口,子句中就是一系列函数或过程的名字。对于主叫方(调用 dll的应用程序或其它的 dll), 则需要在调用之前进行外部声明,即external保留字指示的声明。这些是编写 dll和调用 dll必须 具备的要素。
另外需要了解object pascal 中有关调用协议的内容。在object pascal 中,对于过程和函数 有以下五种调用协议:
指示字 参数传递顺序 参数清除者 参数是否使用寄存器
register 自左向右 被调例程 是
pascal 自左向右 被调例程 否
cdecl 自右向左 调用者 否
stdcall 自右向左 被调例程 否
safecall 自右向左 被调例程 否
这里的指示字就是在声明函数或过程时附加在例程标题之后的保留字,默认为register,即是 唯一使用 cpu寄存器的参数传递方式,也是传递速度最快的方式;
pascal: 调用协议仅用于向后兼容,即向旧的版本兼容;
cdecl: 多用于 c和 c++语言编写的例程,也用于需要由调用者清除参数的例程;
stdcall: 和safecall主要用于调用windows api 函数;其中safecall还用于双重接口。
在本例中,将使用调用协议cdecl ,因为被调用的 dll中,使用的数据库连接是由主叫方传递 得到的,并且需要由主叫方处理连接的关闭和销毁。
下面是 dll完整源程序和主叫程序完整源程序。包括以下四个文件:
project1.dpr {主叫程序}
unit1.pas {主叫程序单元}
project2.dpr {dll}
unit2.pas {dll单元}
{---------- dll 主程序 project2.dpr ----------}
library project2;
uses
sysutils,
classes,
unit2 in ‘unit2.pas‘ {form1};
{$r *.res}
{ 下面的语句用于向调用该 dll的程序提供调用接口 }
exports
dotest; { 过程来自单元unit2 }
begin
end.
delphi中高级dll的编写和调用(2)
{---------- dll中的单元 unit2.pas ----------}
unit unit2;
interface
uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
db, adodb, stdctrls, menus;
type
tform1 = class(tform)
adoconnection1: tadoconnection;{ 本地数据库连接 }
memo1: tmemo; { 用于显示信息 }
private
public
end;
{ 该过程向外提供 }
procedure dotest(h: thandle; { 获得调用者的句柄 }
aconn: tadoconnection;{ 获得调用者的数据库连接 }
s: string; { 获得一些文本信息 }
n: integer); { 获得一些数值信息 }
cdecl; { 指定调用协议 }
implementation
{$r *.dfm}
procedure dotest(h: thandle; aconn: tadoconnection; s: string; n: integer);
begin
application.handle := h; { 将过程的句柄赋值为调用者的句柄 }
{ 上面语句的作用在于, dll的句柄和调用者的句柄相同,在任务栏中就不会 }
{ 各自出现一个任务标题了。 }
with tform1.create(application) do try{ 创建窗体 }
memo1.lines.append(‘成功调用‘); { 显示一行信息 }
adoconnection1 := aconn; { 获得数据库连接的实例 }
memo1.lines.append(
adoconnection1.connectionstring +
‘ - ‘ + s + ‘ - ‘ + inttostr(n)); { 根据得到的参数显示另一行信息 }
showmodal; { 模式化显示窗体 }
finally
free; { 调用结束时销毁窗口 }
end;
end;
end.
{---------- 调用者 project1.dpr,很普通的工程文件 ----------}
program project1;
uses
delphi中高级dll的编写和调用(3)
forms,
unit1 in ‘unit1.pas‘ {form1};
{$r *.res}
begin
application.initialize;
application.createform(tform1, form1);
application.run;
end.
{---------- 调用者单元unit1.pas ----------}
unit unit1;
interface
uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
stdctrls, db, adodb;
type
tform1 = class(tform)
button1: tbutton; { 按此按钮进行调用 }
adoconnection1: tadoconnection; { 本地数据库连接,将传递给 dll }
procedure button1click(sender: tobject);{ 调用 dll}
private
public
end;
var
form1: tform1;
implementation
{$r *.dfm}
{ 外部声明必须和 dll中的参数列表一致,否则会运行时错误 }
procedure dotest(h: thandle; { 传递句柄 }
aconn: tadoconnection; { 传递数据库连接 }
s: string; { 传递文本信息 }
n: integer); { 传递数值信息 }
cdecl; { 指定调用协议 }
external ‘project2.dll‘;{ 指定过程来源 }
{ 调用过程 }
procedure tform1.button1click(sender: tobject);
begin
dotest(application.handle,
adoconnection1,
‘call ok‘,
256);
end;
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用技巧
- Delphi中高级DLL的编写和调用 收藏
- Delphi编写和调用DLL的重点
- Delphi环境中编写调用DLL的方法和技巧
- 用Delphi编写和调用DLL
- java 调用 delphi编写的dll
- 使用Delphi调用C++编写的DLL
- Java中调用Delphi编写的DLL
- java 调用 delphi编写的dll
- Delphi调用VC++6.0编写的Dll
- VB调用Delphi编写的DLL - 1
- VB调用Delphi编写的DLL - 2
- Javascript乱弹设计模式系列(0) - 面向对象基础以及接口和继承类的实现
- Delphi之字符串
- Delphi format的用法
- html技巧 (转)
- 关于delphi调用c#写的webservice
- Delphi中高级DLL的编写和调用
- html:messages(转)
- 关于Delphi第三方面控DbGridEh的一些使用
- [Delphi程序开发]delphi编程中在状态栏动态添加进度条
- HTML 5 标签、属性、事件及浏览器兼容性速查表
- .Net调用Java的WebService之亲身体验
- 修改 IE 默认HTML编辑器
- 静态页中利用AJAX.NET实现无刷新页面
- ECMAScript 5与HTML5 的支持情况