网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
Delphi中动态链接库两种调用方式的比较
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式
程序的地址空间,即使DLL已不再需要了。动态调用方式就可解决以上问题,它在需要用到DLL的时候才通过LoadLibrary函数引入,用完后通过FreeLibrary函数从内存中卸载,而且通过调GetProcAddress函数可以指定不同的例程。最重要的是,如果指定的DLL出错,至多是API调用失败,不会导致程序终止。以下将通过具体的实例说明说明这调用方式的使用方法。

  1. 静态调用方式

  示例程序创建了一个DLL,其中仅包含一个求两个整数的和的函数,在主程序中输入两个整数,通过调用该DLL,即可求出两个整数的和,如图1所示。


图1 DLL的静态调用



  该DLL的程序代码如下:

library AddNum;
uses
SysUtils,
Classes;

{$R *.res}

function AddNumber(Num1,Num2:integer):integer;stdcall; //定义求和函数
 begin
  result:=Num1+Num2;
 end;
  exports
  AddNumber; //引出求和函数
 begin
end.

  主程序在调用该DLL时,首先在interface部分声明要调用的函数:

function AddNum(Num1,Num2:integer):integer;stdcall;external ''AddNum.dll''
name ''AddNumber'';

  然后在按钮控件的事件中写入如下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
 Number1,Number2:integer;
 Sum:integer;
begin
 Number1:=strtoint(Edit1.Text);
 Number2:=strtoint(Edit2.Text);
 Sum:=AddNum(Number1,Number2); //调用求和函数计算结果
 Edit3.Text:=inttostr(Sum);
end;
2.动态调用方式

  这个示例程序创建了一个显示日期的DLL,其中包含一个窗体,如图2所示。


图2 DLL的动态调用



  程序中定义了一个ShowCalendar函数,返回在这个窗体中设定的日期。函数定义如下:

function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
var
 DLLForm: TDLLForm;
begin
 Application.Handle := AHandle;
 DLLForm := TDLLForm.Create(Application); //创建并显示窗体
 try
  DLLForm.Caption := ACaption;
  DLLForm.ShowModal; //显示方式为模式化
  Result := DLLForm.calDLLCalendar.CalendarDate; //返回设定日期
 finally
  DLLForm.Free; //用完后卸载该窗体
 end;
end;

  在DLL的工程文件中用exports ShowCalendar; 语句引出该函数。下面通过一个简单的应用程序测试一下该DLL文件。新建一个工程文件,在窗体中放置一个Label控件和一个按钮控件,在按钮控件的OnClick事件中编写如下代码:

procedure TMainForm.Button1Click(Sender: TObject);
var
 OneHandle : THandle; //定义一个句柄变量
begin
 OneHandle := LoadLibrary(''Clendar.dll''); //动态载入DLL,并返回其句柄
 try
  if OneHandle <> 0 then //如果载入成功则获取ShowCalendar函数的地址
   @ShowCalendar := GetProcAddress(OneHandle, ''ShowCalendar'');
   if not (@ShowCalendar = nil) then
    //如果找到该函数则在主窗体的Label1中显示DLL窗体中设定的日期
    Label1.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
   else
    RaiseLastWin32Error;
 finally
  FreeLibrary(OneHandle); //调用完毕收回DLL占用的资源
 end;
end;

  从以上程序中可以看到DLL的动态调用方式比静态调用方式的优越之处。DLL例程在用到时才被调入,用完后就被卸载,大大减少了系统资源的占用。在调用LoadLibrary函数时可以明确指定DLL的完整路径,如果没有指定路径,运行时首先查找应用程序载入的目录,然后是Windows系统的System目录和环境变量Path设定的路径。

  五、结束语

  由于动态链接库可以实现代码和资源的共享,大大减少系统资源的占用,因此在当今的应用程序开发中起着非常重要的作用。Delphi是现今流行的应用软件开发工
  • 上一篇资讯: 程序删除自身
  • 下一篇资讯: 处理数据栅格的编辑框
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号