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

Delphi中DLL的创建和使用【转】

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

Delphi中DLL的创建和使用   
  1.DLL简介;   2.调用DLL;   3.创建DLL;   4.两个技巧;   5.初始化;   6.例外处理。     
    
   1、DLL简介   
    DLL是Dynamic-Link   Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图、图标等)。可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用程序或者其他DLL调用。DLL为应用程序间的资源共享提供了方便,同时也是多语言混合编程的重要手段。由此可见学习使用DLL是Windows程序员必须掌握的一项重要技术。   
  
  2、如何调用DLL   
    在Delphi中有两种方法调用DLL中的函数和过程,即外部声明或者动态加载。   
    
  <1>外部声明   
    在Delphi中外部声明是访问外部例程最容易和最常用的方式,有两种声明方式:通过名字、通过索引号。举例如下:在MYDLL.DLL中有两个函数和一个过程,则其外部声明可以写成:   
    
  function   test1:integer;external   'mydll';   
  //直接通过名称调用test1(注意名称大小写敏感)。     
  function   test11:integer;external   'mydll'   name   'test1';   
  //通过名称调用test1,在程序中使用新名称(原名称仍然大小写敏感)。     
  procedure   test2;external   'mydll'   index   1;   
  //通过索引号调用TEST2。程序中可以用与DLL中不一样的名称.     
    使用外部声明的缺点是程序启动时如果找不到mydll.dll将无法运行,即使没有调用其中的模块。   动态加载的方法可以避免这种情况。   
    
  <2>动态加载   
    通过调用Windows   API中的相关函数,将DLL调入内存并获得指向函数或过程的指针,执行完模块后释放内存。除了节约内存外,这种方法的一个很大的优点是能处理找不到dll或者在装入过程中出错的情况。这样即使某个dll有问题,应用程序的其他部分仍然能够正常运行。动态加载的例子如下:   
    
  var   hDll:THandle;   
    Test1:function:integer;   
  begin   
    hDll:=LoadLibrary('mydll.dll');   
    if   hDll<32   then   exit;//如果Dll无法加载则跳出   
    @Test1:=GetProcAddress(hDll,MakeIntResource(1));   
      //取得mydll中的第一个函数的地址。   
    ...   
    FreeLibrary(hDll);   
  end;     
    
  3、用Delphi创建DLL   
    用Delphi创建一个DLL是十分简单的,首先需要新建一个DLL的Porject(如果使用Delphi3.0则可以在File->New对话框中选择DLL),当然也可以自己写,现在这个Project是这样的:   
    
  library   Project1;   
  uses   SysUtils,Classes;   
  begin   
  end.     
    
    当然这是一个空DLL,现在让我们来加入一个函数,让他成为我们的第一个可以使用的DLL。完成后的文件是这样的:   
    
  library   dll1;   
  uses   SysUtils,Classes;   
    
  function   Test1(a,b:integer):integer;   
  begin   
  Result:=a+b;   
  end;   
    
  exports   
  Test1   index   1;   
    
  begin   
  end.     
    
    在这个DLL里我们声明了一个加法函数,然后用exports语句输出它,只有被输出的函数或过程能被其他程序调用。exports语句后的语法是:函数名   [index   <n>],index   <n>是为函数手工指定索引号,以便其他程序确定函数地址;也可以不指定,如果没有使用Index关键字,Delphi将按照exports后的顺序从1开始自动分配索引号。现在我们可以调用这个DLL了,下面给出一个实例,运行后form1的标题将变成“1+2=3”:   
    
  声明部分:function   Test1(a,b:integer):integer;external   'dll1';   
         注意此处是大小写敏感的。   
  运行部分:form1.caption:='1+2='+inttostr(test1(1,2));     
      
  4、使用DLL的两个技巧   
  <1>把现有的项目改成DLL   
    学会制作DLL以前,大多数程序员手中都积攒下来不少已经完成了的项目,如果现在需要把这些项目做成DLL而不是可执行文件,重新写一遍显然是没有必要的,只要按照下面的步骤对已有的项目文件进行修改就可以了:   
    ① 打开项目文件(.DPR),删除单元底部begin和end.之间的所有语句(一般情况下这些语句是由Delphi自动生成的)。如果项目中没有用到Form,则从uses子句中删除表单单元(Form),然后转到第③步。   
    ② 对项目进行修改,令除Main   Form之外的所有Form都是动态生成的,这样我们只要在DLL输出的一个函数或者过程中生成Main   Form,即可调用执行整个项目。我们假设Main   Form的名字是MyMainForm,项目的名字是MyDll,现在在单元底部的begin语句之前加入一个过程,过程的名字为RunMyDll,这个过程将动态生成Main   Form,从而运行整个项目。RunMyDll的写法如下:   
      procedure   InitDll2;   
      begin   
      Application.CreateForm(TMyMainForm,   MyMainForm);   
      MyMainForm.Show;   //如果MyMainForm不可视则需要这一句.   
      end;   
    ③ 如果想要输出其他函数或者过程,而原来的项目中没有,则可以在单元底部的begin语句之前加入这些代码。   
    ④ 在单元底部的begin语句之前加入一个exports小节,然后写出所有想要输出的函数或过程的名字(最好指定索引号)。注意如果执行了第②步,一定要输出RunMyDll过程。   
    ⑤ 将项目文件顶部的保留字program改为library。   
    ⑥ 编译。   
    现在就可以在其他程序中调用本项目中的函数和过程了,只要执行RunMyDll就可以执行这个项目,和执行原来的可执行文件一模一样。   
    
  <2>创建一个引入文件   
    如果DLL比较复杂,则为它的声明专门创建一个引入程序单元将是十分有意义的,并且会使这个DLL变得更加容易维护。引入单元的格式如下:   
    unit   MyImport;   {Import   unit   for   MyDll.Dll}   


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
MATLAB小常识4 - zannier发布时间:2022-07-18
下一篇:
VC6调用matlab7里的m程序的案例及方法发布时间: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