• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

动态库的编写和调用-Delphi

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

uDll.pas
  function Add10(ANum: integer): integer; stdcall; //Delphi 默认采用 register 调用约定,如果dll涉及跨语言调用,最好

明确指出采用 stdcall 调用约定

library MyDll;


uses

  ShareMem;  // 如果dll 涉及长字符串的参数或变量,需要在 uses 第一的位置引用 ShareMem 单元。


exports  

  Add10;


可以使用标准指令以方便和加速过程、函数的调用。即 name,index,resident
  Add10 name 'NewAdd';  //如果不写 name,默认以过程或函数最初声明的名称为准  

  Add10 index 1;     //如果不写 index,默认编译器按顺序自动分配;index指令只对 windows 系统有用如果要同时使用 name 和 index ,那么 index 必须置于 name 前面    

resident 主要为了向后兼容,编译器将忽略它


注意: exports 可以导出重载(overload)函数,但书写函数时必须加上参数。例如:
Add10(ANum: integer) name 'Add10_Int';

Add10(Anum: real)    name 'Add10_Real'; //可以加一个 name 分别标示名称。 重载时一定不能用 index 指令

在 Widnows 32 位程序中,两个应用程序的地址空间是相互没有联系的。DLL 在内存中是一份拷贝(每个应用程序的进程空间各自拥有该 DLL 的一个副本及自身的一套全局变量),而变量是在各进程的地址空间中,因此不能借助 DLL 的全局变量来达到两个应用程序间的数据传递,除非使用内存映像文件。

调用 dll:
(1)静态调用
function Add10(ANum: integer): integer; stdcall; external 'MyDll.dll';
注意:
•  必须用 stdcall 作为调用参数。 
•  大小写敏感。与 Delphi 程序不同,调用动态链接库是大小写敏感的

(2)动态调用
type   
  TAdd10 = function(ANum: integer): integer; stdcall; 

const  
  MyDllName = 'MyDll.dll';

var   
  handle:THandle ;   
  FPointer: TFarProc;   
  MyFunc : TAdd10 ; 
begin  
  handle := LoadLibrary(MyDllName);                   {装载 DLL 到内存}   
  if handle <> 0 then  begin   
    try       
      FPointer  := GetProcAddress(handle, 'Add10’);  {获得函数的入口地址}       
      //@MyFunc := GetProcAddress(handle, 'Add10’);       
      //if @MyFunc <> nil then  //也可以采用这种编写方式      
      if FPointer  <> nil then  begin         
        MyFunc := TAdd10(FPointer) ;        
        …………      
      end;    
    finally      
      FreeLibrary(handle);                            {释放 dll}    
    end;  
  end; 
end; 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlabcolormap发布时间:2022-07-18
下一篇:
matlab范德蒙矩阵生成学习发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap