关于超想
本站导航
邮件列表
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> delphi -> 开发技巧 -> API相关 ->详细
相关内容  
 
 
在程序运行期设置QUERY控件的PARAMS
 
【新品推荐】

  详细内容
 

DELPHI 中动态链接库的使用
作者: 评价: 上站日期: 2001-05-09
内容说明:
来源:

  在DELPHI中,有两种方法可用于调用一个储存在DLL(动态链接库)中的过程。 

一、 调用方法 

1、 静态调用或显式装载使用一个外部声明子句,使DLL在应用程序开始执行前即被装入。例如: 

Function instring (sourcestr: Pchar ;
check: char): integer; far; external ‘ demostr’
这种方式要在单元的interface 部分用external 指示字列出要从DLL中调用的例程。Far 指令表明可以被其他段,例如其他单元调用的子例程。所有在单元接口中声明的子例程在缺省情况下都是Far类型的,其相反的指令是near。 

如果external 后什么也不跟,必须用 {$ L } 编译指令预先指定一个DLL名字,如: 

{ $ L Mydlls.dll }
Procedure setstring(var str: string) ;
stdcall ; external
但是使用静态调用方法时,程序无法在运行时间里决定DLL的调用。在DELPHI中使用DLL时,例程的标识符必须与DLL中相应输出例程的标识符完全一致(尽管DELPHI本身大小写不敏感)。 

2、 动态调用或隐式装入 

使用WINDOWS API 函数 Loadlibrary 和GetprocAddress可以实现在运行时间里的动态装载DLL,并调用其中的过程。 

例如: 

      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
二、 调用方式 

1、 通过过程、函数名; 

2、 通过过程、函数别名; 

3、 通过过程、函数的顺序号 

例:Function Getstring : string ; stdcall ; external ‘Mydlls.dll’ name ‘Mygetstr’name 子句指定函数名Getstring 改为Mygetstr,当程序调用这个例程时,使用Mygetstr这个名字;Function Getstring : string ; stdcall ; external ‘Mydlls.dll’ index 5 Index 子句通过索引号引入例程可以减少DLL的加载时间。 

三、 调用约定 

调用约定,是指调用例程时参数的传递顺序。DELPHI中DLL支持的调用约定有: 

调用约定 参数传递顺序
Register 从左到右
Pascal 从左到右
Stdcall 从右到左
Cdecl 从右到左
Safecall 从右到左
使用Stdcall 方式,能保证不同语言写的DLL的兼容性,同时它也是WINDOWS API的约定方式;Delphi 3。0、4。0的默认调用方式为Register ;Cdecl是采用 C/C++的调用约定,适用于DLL是由C++语言编写的;Safecall 是适合于声明OLE对象中的方法。 

四、 DLL中的变量和段 

一个DLL声明的任何变量都为自己私有 ,调用它的模块不能直接使用它定义的变量。要使用时必须通过过程或函数界面才能完成,对DLL来说,它永远都没有机会使用调用它的模块中的声明的变量。一个DLL没有自己的SS(堆栈段),它使用调用它的应用程序的堆栈。因此在DLL中的过程、函数不要假定DS=SS(DS为数据段)。 

 
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> delphi -> 开发技巧 -> API相关 ->详细
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
声明:本站内容除注明原创以外均从网上摘抄,如有侵权请指明。
  如果您对我们的网站有什么意见或者建议,请与我们联系
powered by 建站易上手- V2.0