在Delphi中调用DLL

转载 2004年09月10日 14:53:00

<一>在Delphi中静态调用DLL top

调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我

们先举一个静态调用的例子。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

//本行以下代码为我们真正动手写的代码

function TestDll(i:integer):integer;stdcall;
external ’Delphi.dll’;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(TestDll(1));
end;

end.

上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。大

家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。(本例中

调用程序和Delphi.dll在同一个目录中。)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。您可做这样一个实验:输入“

TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。注意事项有以
下一些:

一、调用参数用stdcall。
和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。

二、用external语句指定被调用的DLL文件的路径和名称。
正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。没有写路径是因为该DLL文件和调用它的主程序在同一目录下。如

果该DLL文件在C:/,则我们可将上面的引用语句写为external ’C:/Delphi.dll’。注意文件的后缀.dll必须写上。

三、不能从DLL中调用全局变量。
如果我们在DLL中声明了某种全局变量,如:var s:byte 。这样在DLL中s这个全局变量是可以正常使用的,但s不能被调用程序使用,既s不能

作为全局变量传递给调用程序。不过在调用程序中声明的变量可以作为参数传递给DLL。

四、被调用的DLL必须存在。
这一点很重要,使用静态调用方法时要求所调用的DLL文件以及要调用的函数或过程等等必须存在。如果不存在或指定的路径和文件名不正确的

话,运行主程序时系统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。

<二>在Delphi中动态调用DLL top

动态调用DLL相对复杂很多,但非常灵活。为了全面的说明该问题,这次我们举一个调用由C++编写的DLL的例子。首先在C++中编译下面的DLL源

程序。

#include

extern ”C” _declspec(dllexport)
int WINAPI TestC(int i)
{
return i;
}

编译后生成一个DLL文件,在这里我们称该文件为Cpp.dll,该DLL中只有一个返回整数类型的函数TestC。为了方便说明,我们仍然引用上面的

调用程序,只是将原来的Button1Click过程中的语句用下面的代码替换掉了。

procedure TForm1.Button1Click(Sender: TObject);
type
TIntFunc=function(i:integer):integer;stdcall;
var
Th:Thandle;
Tf:TIntFunc;
Tp:TFarProc;
begin
Th:=LoadLibrary(’Cpp.dll’); {装载DLL}
if Th>0 then
try
Tp:=GetProcAddress(Th,PChar(’TestC’));
if Tp<>nil
then begin
Tf:=TIntFunc(Tp);
Edit1.Text:=IntToStr(Tf(1)); {调用TestC函数}
end
else
ShowMessage(’TestC函数没有找到’);
finally
FreeLibrary(Th); {释放DLL}
end
else
ShowMessage(’Cpp.dll没有找到’);
end;

大家已经看到了,这种动态调用技术很复杂,但只要修改参数,如修改LoadLibrary(’Cpp.dll’)中的DLL名称为’Delphi.dll’就可动态更改

所调用的DLL。

一、定义所要调用的函数或过程的类型。
在上面的代码中我们定义了一个TIntFunc类型,这是对应我们将要调用的函数TestC的。在其他调用情况下也要做同样的定义工作。并且也要加

上stdcall调用参数。

二、释放所调用的DLL。
我们用LoadLibrary动态的调用了一个DLL,但要记住必须在使用完后手动地用FreeLibrary将该DLL释放掉,否则该DLL将一直占用内存直到您退

出Windows或关机为止。

现在我们来评价一下两种调用DLL的方法的优缺点。静态方法实现简单,易于掌握并且一般来说稍微快一点,也更加安全可靠一些;但是静态方

法不能灵活地在运行时装卸所需的DLL,而是在主程序开始运行时就装载指定的DLL直到程序结束时才释放该DLL,另外只有基于编译器和链接器

的系统(如Delphi)才可以使用该方法。动态方法较好地解决了静态方法中存在的不足,可以方便地访问DLL中的函数和过程,甚至一些老版本

DLL中新添加的函数或过程;但动态方法难以完全掌握,使用时因为不同的函数或过程要定义很多很复杂的类型和调用方法。对于初学者,笔者

建议您使用静态方法,待熟练后再使用动态调用方法。

Delphi调用C写的dll

一.用C语言写了一个Dll,编译成功。 是一个非常简单的加密算法,代码如下: #include __declspec(dllexport) void Encipher(char a[16])  ...
  • farrellcn
  • farrellcn
  • 2014年01月17日 20:10
  • 1408

Delphi动态调用C++写的DLL

c++ DLL 文件,建议用最简单的c++编辑工具。不会加入很多无关的DLL文件。本人用codeblocks+mingw。不像 VS2010,DLL编译成功,调用的时候会提示缺其他DLL。 系统生成的...
  • mycoolme5
  • mycoolme5
  • 2016年04月13日 16:51
  • 527

Delphi7程序调用C#写的DLL解决办法(DLL)

近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题。在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:     编写C#dll的方法都一样,首先在vs2005中创建...
  • zlwzlwzlw
  • zlwzlwzlw
  • 2015年02月10日 10:15
  • 2661

C/C++调用Delphi制作的dll时发现的一些问题

做了一个网络业务逻辑实体,是用C++编写的dll,内部有一个全局的业务实体,外部准备用Delphi编写的界面程序来控制并显示状态...... 1. C++的dll中不能用C++风格的导出方式:_dec...
  • gyymen
  • gyymen
  • 2016年12月09日 08:31
  • 1067

Delphi调用C++编写的动态链接库dll的方法

首先我们先看一下普通Delphi调用动态链接库dll的方法: {===================静态调用DLL函数===================} //首先声明这个DLL中的...
  • qq_22129035
  • qq_22129035
  • 2015年11月16日 11:48
  • 1497

Delphi程序调用C#.Net编译的DLL并打开窗体(详解)

转自: http://www.csframework.com/archive/2/arc-2-20110408-1307.htm Delphi程序调用C#.Net编译的DL...
  • hatchgavin
  • hatchgavin
  • 2014年12月16日 15:39
  • 5390

Delphi中怎么调用VC++创建的动态链接库

Delphi以其独特的面向控件的研发方式、强大的数据库功能、快速的编译技术及简单易学的编程特性,使得他自发布之日起即格外引人注目,许多程式员也因此将他作为最佳选择的研发工具。然而,Delphi在科学计...
  • slj_win
  • slj_win
  • 2014年07月29日 21:31
  • 1109

c#调用delphi写的dll遇到并解决的问题

c#调用delphi写的dll,需要以一级指针、二级指针作为参数传递。
  • cslover2015
  • cslover2015
  • 2017年01月06日 16:53
  • 1715

Delphi 类库(DLL)动态调用与静态调用示例讲解

在Delphi或者其它程序中我们经常需要调用别人写好的DLL类库,下面直接上示例代码演示如何进行动态和静态的调用方法:...
  • wangchixiao
  • wangchixiao
  • 2014年12月26日 11:12
  • 1689

Delphi调用C# 编写dll动态库

Delphi调用C# 编写dll动态库
  • chenhongwu666
  • chenhongwu666
  • 2016年12月02日 15:48
  • 398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Delphi中调用DLL
举报原因:
原因补充:

(最多只允许输入30个字)