全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Delphi中调用DLL 版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private Private declarations public Public declarations end; var Form1: TForm1; implementation $R *.DFM /本行以下代码为我们真正动手写的代码 function TestDll(i:integer):integer;stdcall; external Delphi.dll; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:=IntToStr(TestDll(1); end; end. 上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。大家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。(本例中调用程序和Delphi.dll在同一个目录中。)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。您可做这样一个实验:输入“TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。注意事项有以 下一些: 一、调用参数用stdcall。 和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。 二、用external语句指定被调用的DLL文件的路径和名称。 正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。没有写路径是因为该DLL文件和调用它的主程序在同一目录下。如果该DLL文件在C:,则我们可将上面的引用语句写为external C:Delphi.dll。注意文件的后缀.dll必须写上。 三、不能从DLL中调用全局变量。 如果我们在DLL中声明了某种全局变量,如:var s:byte 。这样在DLL中s这个全局变量是可以正常使用的,但s不能被调用程序使用,既s不能作为全局变量传递给调用程序。不过在调用程序中声明的变量可以作为参数传递给DLL。 四、被调用的DLL必须存在。 这一点很重要,使用静态调用方法时要求所调用的DLL文件以及要调用的函数或过程等等必须存在。如果不存在或指定的路径和文件名不正确的话,运行主程序时系统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。 在Delphi中动态调用DLL top 动态调用DLL相对复杂很多,但非常灵活。为了全面的说明该问题,这次我们举一个调用由C+编写的DLL的例子。首先在C+中编译下面的DLL源程序。 #include extern ”C” _declspec(dllexport) int WINAPI TestC(int i) return i; 编译后生成一个DLL文件,在这里我们称该文件为Cpp.dll,该DLL中只有一个返回整数类型的函数TestC。为了方便说明,我们仍然引用上面的调用程序,只是将原来的Button1Click过程中的语句用下面的代码替换掉了。 procedure TForm1.Button1Click(Sender: TObject); type TIntFunc=function(i:integer):integer;stdcall; var Th:Thandle; Tf:TIntFunc; Tp:TFarProc; begin Th:=LoadLibrary(Cpp.dll); 装载DLL if Th0 then try Tp:=GetProcAddress(Th,PChar(TestC); if Tpnil then begin Tf:=TIntFunc(Tp); Edit1.Text:=IntToStr(Tf(1); 调用TestC函数 end else ShowMessage(TestC函数没有找到); finally FreeLibrary(Th); 释放DLL end else ShowMessage(Cpp.dll没有找到); end; 大家已经看到了,这种动态调用技术很复杂,但只要修改参数,如修改LoadLibrary(Cpp.dll)中的DLL名称为Delphi.dll就可动态更改所调用的DLL。 一、定义所要调用的函数或过程的类型。 在上面的代码中我们定义了一个TIntFunc类型,这是对应我们将要调用的函数TestC的。在其他调用情况下也要做同样的定义工作。并且也要加上stdcall调用参数。 二、释放所调用的DLL。 我们用LoadLibrary动态的调用了一个DLL,但要记住必须在使用完后手动地用FreeLibrary将该DLL释放掉,否则该DLL将一直占用内存直到您退出Windows或关机为止。 现在我们来评价一下两种调用DLL的方法的优缺点。静态方法实现简单,易于掌握并且一般来说稍微快一点,也更加安全可靠一些;但是静态方法不能灵活地在运行时装卸所需的DLL,而是在主程序开始运行时就装载指定的DLL直到程序结束时才释放该DLL,另外只有基于编译器和链接器的系统(如Delphi)才可以使用该方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年湖北辅警协警招聘考试备考题库附答案详解(考试直接用)
- 2025年百色辅警协警招聘考试真题附答案详解(精练)
- 2025年赣州辅警协警招聘考试真题附答案详解(考试直接用)
- 2025年淮南辅警协警招聘考试备考题库附答案详解(b卷)
- 2025年邵阳辅警协警招聘考试备考题库有完整答案详解
- 2025年清远辅警招聘考试真题含答案详解(a卷)
- 2025年青岛辅警协警招聘考试备考题库含答案详解ab卷
- 2025年衡水辅警协警招聘考试真题及答案详解(易错题)
- 2025年百色辅警招聘考试题库及一套参考答案详解
- 2025年潮州辅警协警招聘考试备考题库及答案详解(有一套)
- 平台经济下劳动关系认定及权益保障研究-以网约车司机为例
- 2025年消防安全月培训考试试题及答案
- 医院重大事故隐患排查清单
- 人教版二年级数学上册期中测试卷(带答案)
- 电工职业标准培训教材
- 脂代谢课件教学课件
- 银行业后备干部考核题库合集
- 混凝土水池施工质量控制方案
- 泳衣设计基础知识培训课件
- 艺考素描头骨课件
- 2025至2030全球及中国宽带网络行业项目调研及市场前景预测评估报告
评论
0/150
提交评论