⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 102203_05.htm

📁 对于学习很有帮助
💻 HTM
字号:
<html>
<head>
<link REL="stylesheet" HREF="/style.css" TYPE="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>计算机世界日报:
DELPHI  中动态链接库的使用
</title>
<!--***********-->
</head>

<body bgcolor="#FFFFFF" >














<p><br>
<font color="#b904e8"><b><em><a href="class.htm">返回</a></em></b></font>
<center>
<font color="#0000c0"><h2>
DELPHI  中动态链接库的使用
</h2></font>
<h3>
天津师范大学
<br>曹进军
</h3>
</center>
<p><font color="#ffffff">----</font>

在DELPHI中,有两种方法可用于调用一个储存在DLL(动态链接库)中的过程。
<p><font color="#ffffff">----</font>
<b>一、 调用方法</b>
<p><font color="#ffffff">----</font>
1、 静态调用或显式装载
使用一个外部声明子句,使DLL在应用程序开始执行前即被装入。例如:
<pre>
Function instring (sourcestr: Pchar ;
 check: char): integer; far; external ‘ demostr’
</pre>
<p><font color="#ffffff">----</font>
这种方式要在单元的interface 部分用external 指示字列出要从DLL中调用的例程。Far 指令表明可以被其他段,例如其他单元调用的子例程。所有在单元接口中声明的子例程在缺省情况下都是Far类型的,其相反的指令是near。
<p><font color="#ffffff">----</font>
如果external 后什么也不跟,必须用 {$ L } 编译指令预先指定一个DLL名字,如:
<pre>
{ $ L Mydlls.dll }
Procedure setstring(var str: string) ;
 stdcall ; external
</pre>
<p><font color="#ffffff">----</font>
但是使用静态调用方法时,程序无法在运行时间里决定DLL的调用。在DELPHI中使用DLL时,例程的标识符必须与DLL中相应输出例程的标识符完全一致(尽管DELPHI本身大小写不敏感)。
<p><font color="#ffffff">----</font>
2、 动态调用或隐式装入
<p><font color="#ffffff">----</font>
使用WINDOWS API 函数 Loadlibrary 和GetprocAddress可以实现在运行时间里的动态装载DLL,并调用其中的过程。
<p><font color="#ffffff">----</font>
           例如:
<pre>
           Type TMyProc=Procedure (Param:Pchar ) ;Stdcall;
           Var MyProc: TMyproc;
              MyHandle:THandle;
              MyHandle:=LoadLibrary (‘Mydll’) ;
              If MyHandle< =0 then
                Raise Exception.Create
               ( ‘动态链接库调用失败,错误代码
                是:’+Inttostr(Getlasterror))
                else 
                 @MyProc:=GetProcAddress(MyHandle,’demoproc’);
              if  not Assigned(MyProc) then
                Raise Exception.Create('GetProcAddress 
                调用失败,错误代码
                      是:’+inttostr(getlasterror))
                else MyProc(Pchar(‘a string’));
               Freelibrary(Myhandle); // 卸载DLL
</pre>
<p><font color="#ffffff">----</font>
<b>二、 调用方式</b>
<p><font color="#ffffff">----</font>
1、 通过过程、函数名;
<p><font color="#ffffff">----</font>
2、 通过过程、函数别名;
<p><font color="#ffffff">----</font>
3、 通过过程、函数的顺序号
<p><font color="#ffffff">----</font>
例:Function Getstring : string ; stdcall ; external ‘Mydlls.dll’ name ‘Mygetstr’name 子句指定函数名Getstring 改为Mygetstr,当程序调用这个例程时,使用Mygetstr这个名字;Function Getstring : string ; stdcall ; external ‘Mydlls.dll’ index 5 Index 子句通过索引号引入例程可以减少DLL的加载时间。
<p><font color="#ffffff">----</font>
<b>三、 调用约定</b>
<p><font color="#ffffff">----</font>
调用约定,是指调用例程时参数的传递顺序。DELPHI中DLL支持的调用约定有:
<pre>
调用约定	参数传递顺序
Register	从左到右
Pascal		从左到右
Stdcall		从右到左
Cdecl		从右到左
Safecall	从右到左
</pre>
<p><font color="#ffffff">----</font>
使用Stdcall 方式,能保证不同语言写的DLL的兼容性,同时它也是WINDOWS API的约定方式;Delphi 3。0、4。0的默认调用方式为Register ;Cdecl是采用 C/C++的调用约定,适用于DLL是由C++语言编写的;Safecall 是适合于声明OLE对象中的方法。
<p><font color="#ffffff">----</font>
<b>四、 DLL中的变量和段</b>
<p><font color="#ffffff">----</font>
一个DLL声明的任何变量都为自己私有 ,调用它的模块不能直接使用它定义的变量。要使用时必须通过过程或函数界面才能完成,对DLL来说,它永远都没有机会使用调用它的模块中的声明的变量。一个DLL没有自己的SS(堆栈段),它使用调用它的应用程序的堆栈。因此在DLL中的过程、函数不要假定DS=SS(DS为数据段)。



 



<p align="right"><small><em>中国计算机世界出版服务公司版权所有</em></small> 
<br>
</p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -