![]() |
![]() |
| 首页>> 软件工程 >>内容 | |||||||
在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。 unit Unit1; interface uses type var implementation {$R *.DFM} //本行以下代码为我们真正动手写的代码 function TestDll(i:integer):integer;stdcall; procedure TForm1.Button1Click(Sender: TObject); end. 上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。大家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。(本例中调用程序和Delphi.dll在同一个目录中。)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。您可做这样一个实验:输入“TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。 注意事项有以下一些: 一、调用参数用stdcall。 二、用external语句指定被调用的DLL文件的路径和名称。 三、不能从DLL中调用全局变量。 四、被调用的DLL必须存在。 编写技巧 2 、为了保证DLL的通用性,应该在自己编写的DLL中杜绝出现可视化控件的名称,如:Edit1.Text中的Edit1名称;或者自定义非Windows定义的类型,如某种记录。 3 、为便于调试,每个函数和过程应该尽可能短小精悍,并配合具体详细的注释。 4 、应多利用try-finally来处理可能出现的错误和异常,注意这时要引用SysUtils单元。 5 、尽可能少引用单元以减小DLL的大小,特别是不要引用可视化单元,如Dialogs单元。例如一般情况下,我们可以不引用Classes单元,这样可使编译后的DLL减小大约16Kb。 调用技巧 2 、可把我们编写的DLL放到Windows目录下或者Windows\system目录下。这样做可以在external语句中或LoadLibrary语句中不写路径而只写DLL的名称。但这样做有些不妥,这两个目录下有大量重要的系统DLL,如果您编的DLL与它们重名的话其后果简直不堪设想,况且您的编程技术还不至于达到将自己编写的DLL放到系统目录中的地步吧! 调试技巧 2 、添加DLL的版本信息。开场白中提到了版本信息对于DLL是很重要的,如果包含了版本信息,DLL的大小会增加2Kb。增加这么一点空间是值得的。很不幸我们如果直接使用Project|options菜单中Version选项是不行的,这一点Delphi的帮助文件中没有提到,经笔者研究发现,只要加一行代码就可以了。如下例: library Delphi; uses {$R *.RES} function TestDll(i:integer):integer;stdcall; exports begin 3 、为了避免与别的DLL重名,在给自己编写的DLL起名字的时候最好采用字符数字和下划线混合的方式。如:jl_try16.dll。 4 、如果您原来在Delphi 1或Delphi 2中已经编译了某些DLL的话,您原来编译的DLL是16位的。只要将源代码在新的Delphi 3或Delphi 4环境下重新编译,就可以得到32位的DLL了 1.C++共享Delphi对象 参考文章:DELPHI 中动态链接库的使用 http://blog.csdn.net/feifei1018/admin/EditPosts.aspx 在DELPHI中,有两种方法可用于调用一个储存在DLL(动态链接库)中的过程。 参考文章:Delphi中如何调用VC++创建的动态链接库http://www.ccw.com.cn/htm/app/aprog/01_10_29_2.asp Delphi以其独特的面向控件的开发方式、强大的数据库功能、快速的编译技术以及简单易学的编程特性,使得它自发布之日起即格外引人注目,许多程序员也因此将它作为首选的开发工具。然而,Delphi在科学计算、低端编程等方面的功能不如VC++。VC++功能强大、齐全,但是整个系统比较复杂、庞大,尤其对于初学者来说比较难学,其用户界面的开发远不如Delphi那样方便、快捷。那么,我们能否将两者的优点结合起来呢?答案是肯定的!具体做法是:将涉及到比较低级的操作、计算等方面的程序用VC++写成函数放在动态链接库中,而涉及到界面及与用户交互的编程则用Delphi来实现,最后只需在Delphi中调用VC++编写的动态链接库即可 一、动态链接库简介 动态链接库(DLL,即 “Dynamic-Link Library”)是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。DLL是Windows的基石,所有的Win32 API函数都包含在DLL中。使用DLL有许多优点: 1、一个DLL可以提供给不同的程序使用,如果有多个程序使用相同的DLL,也只需将DLL在内存中装载一次,这样就节省了内存开销。 2、DLL可以使我们的编程更加模块化,将功能相对独立的模块编成一个动态链接库,这样改动程序时不需将整个程序重新编译,只需重新编译所改动的模块。 3、使用了DLL组件包可以大大减小可执行文件的规模。 4、对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成DLL,用主程序调用,这样既减少了开发的工作量,又提高了访问速度。 5、DLL独立于编程语言,大多数WINDOWS编程环境都允许主程序调用DLL中的函数。即可以用VC++、VB、PowerBuilder、Delphi、汇编语言等建立DLL,然后在不同语言编制的应用程序中调用它。这样就给多人使用不同的编程语言开发项目提供了极大的方便。
二、在Delphi中调用VC++创建的动态链接库的实例
(一)实验环境 本实例的编程工具及运行环境为:Windows 98,VC++6.0,Delphi 5.0 。
(二)实验内容
1.用VC++6.0建立一个动态链接库MaxMin.DLL,该库中包含有两个函数:返回三个整数中最大整数的函数Max1( )和返回三个整数中最小整数的函数Min1( )。
;2.用Delphi编写测试程序调用动态链接库MaxMin.DLL中的两个函数。
(三)实验步骤
1.用VC++6.0建立动态链接库MaxMin.DLL 第一步:启动VC++6.0,选择“File/New/MFC AppWizzard(Dll)”,工程名设为“MaxMin”,按“确定”钮后,选择“Regular DLL Using shared MFC DLL”,按“Finish”钮后,即创造了一个DLL的框架工程。 第二步:选择“File/New”,在出现的对话框中选择“C/C++ Header File”,在文件名处输入“MyDLL”,按“确定”钮,即创建了一个空的头文件“MyDLL.h”。在该文件中输入以下两行内容: extern "C" _declspec(dllexport) int Min1(int x,int y,int z); extern "C" _declspec(dllexport) int Max1(int x,int y,int z); 选择“File/Save”保存该文件的内容。 第三步:选择“File/New”,在出现的对话框中选择“C/C++ Source File”, 在文件名处输入“MyDLL”,按“确定”钮,即创建了一个空的源文件“MyDLL.cpp”。在该文件中输入以下内容: #include "stdafx.h" #include "MyDll.h" extern "C" __declspec(dllexport) int Min1(int x,int y,int z) { if ((x<=y) & (x<=z)) return x; else if ((y<=x) & (y<=z)) return y; else return z; /*找出x,y,z中的最小整数*/ } extern "C" __declspec(dllexport) int Max1(int x,int y,int z) { if ((x>=y) & (x>=z)) return x; else if ((y>=x) & (y>=z)) return y; else return z; /*找出x,y,z中的最大整数*/ } 选择“File/Save”保存该文件的内容。 第四步:按下运行图标“!”,即生成了MyDLL.DLL(在当前工程目录的DEBUG子目录下)。 2.用Delphi编写调用MaxMin.DLL的测试程序 调用动态链接库有两种方法,即隐式调用和显式调用。 (1)隐式调用 第一步:启动Delphi,选择“New Application”,生成一个空的应用程序,在Form的“Name”属性处输入“TestVcDLLForm”,Caption属性处输入“VC++的DLL隐式调用测试”,在Form中放入控件如表1所示(其中所有的Edit控件的“Text”属性均设为空):
(表1:所用到的控件及其属性) (图1:应用程序屏幕效果) 最后设计的Form的屏幕效果如图1所示。选择“File/Save all”,在“Save unit1 as”对话框中将源文件名设为“main.pas”,按“保存”钮;在“Save Project1 as”对话框中将工程名设为“TestVcDLL”,按“保存”钮。 第二步:选择“File/New…”,在出现的“New Item”对话框中选择“unit”,按“OK”钮,生成一个空的源文件,在该文件中输入以下内容: unit MaxMin; interface function Min1(x,y,z:Integer):Integer; stdcall; function Max1(x,y,z:Integer):Integer; stdcall; implementation function Min1;external 'MaxMin.DLL' name 'Min1'; function Max1;external Max'Min.DLL' name 'Max1'; end. 选择“File/Save As…”,将上述文件存为“MaxMin.pas”。 第三步:在Main.pas文件中,在“implementation”语句后加入: uses MaxMin; 第四步:在Form上双击“运行”按钮对该按钮的“Click”事件编程,代码如下: procedure TTestVcDLLForm.btnRunClick(Sender: TObject); begin edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text), StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //调用动态链接库中的函数Max1 edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text), StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //调用动态链接库中的函数Min1 end; 保存该文件。 第五步:将上述1.中VC++6所建立的动态链接库“MaxMin.DLL”拷入Delphi的当前工作目录中。 第六步:运行。结果如图2所示。
图2:隐式调用DLL运行结果 图3:显式调用DLL运行结果 (2)显示调用 第一步:同隐式调用。只是将Form的“Caption”属性改为“VC++的DLL显式调用测试”。 第二步:选择“File/New…”,在出现的“New Item”对话框中选择“unit”,按“OK”钮,生成一个空的源文件,在该文件中输入以下内容: unit Unit1; interface type TMin1=function(x,y,z:Integer):Integer; stdcall; TMax1=function(x,y,z:Integer):Integer; stdcall; THandle=Integer; implementation end. 选择“File/Save As…”,将上述文件存为“MaxMin.pas”。 第三步:在Main.pas文件中,在“implementation”语句后加入: uses MaxMin; 第四步:在Form上双击“运行”按钮对该按钮的“Click”事件编程,代码如下: procedure TTestVcDLLForm.btnRunClick(Sender: TObject); var Handle:THandle; Min1:TMin1; Max1:TMax1; begin Handle:=LoadLibrary('MaxMin.dll'); //将“MaxMin.dll”的文件映象映射进调用进程的地址空间 if Handle<>0 then begin @Min1:=GetProcAddress(Handle,'Min1'); //取得DLL中函数Min1( )的地址 @Max1:=GetProcAddress(Handle,'Max1'); //取得DLL中函数Max1( )的地址 if (@Min1<>nil) and (@Min1<>nil) then begin edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text), StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //调用动态链接库中的函数Min1 edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text), StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //调用动态链接库中的函数Max1 end else ShowMessage('调用函数“GetProcAddress”时出错!'); FreeLibrary(Handle); //从进程的地址空间中解除“MaxMin.dll”文件的映射 end; end; 保存该文件。 第五步:将上述1.中VC++6所建立的动态链接库“MaxMin.DLL”拷入Delphi的当前工作目录中。 第六步:运行。结果如图3所示。 以上实例均编译通过,运行正确。 三、结束语 动态链接库为不同编程环境下的应用程序之间的连接提供了方便,节省了内存,提高了速度,同时也丰富了PowerScript语言的编程能力。动态链接库是Windows下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作;利用动态链接库,用户可以逐步去构筑自己的程序模块库,为今后的工作积累素材。 |
|
|
【相关文章】 |
|
Copyright 2003-2005 创想软件 All Rights Reserved |
江苏徐州:TEL:13196811515,13815325665 |
Email:ntcreating@163.com QQ:46519970 317174686 MSN:kaiserma2004@hotmail.com |