• 注册
当前位置:1313e > 默认分类 >正文

delphi编写与调用DLL(delphi7下测试通过)

delphi编写DLL

下面在delphi中编写一个简单的dll,在该dll中只有一个max函数,返回2个数中的大数(Delphi 5.0)

1New->DLL;取名为DLL_0001,编写代码:

library dll_0001;

uses
   SysUtils,
   Classes;

{$R *.RES}

function max(x,y:integer):integer;stdcall;
begin
     if(x>y) then
      max :=x
      else
      max :=y;
end;

exports max;

begin

end.

红色部分为自己编写,这里和普通的delphi函数是一样的,只是在返回值中带个stdcall参数,然后用exports把函数导出

================================================================================

Delphl调用dll

调用dll分动态调用和静态调用2中,动态调用写起来简单,安全点,动态调用复杂很多,但很灵活;

现在编写一个程序,来调用上面写的dll_0001.dll文件中的max函数

一、new一个Application,在Form中放入2TEdit1TLabek

二、

1、静态调用

unit Unit1;

interface

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

type
   TForm1 = class(TForm)
     Edit1: TEdit;
     Edit2: TEdit;
     Label1: TLabel;
     procedure Edit2KeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;

implementation

{$R *.DFM}
function max(x,y:integer):integer;stdcall;
external 'dll_0001.dll';

procedure TForm1.Edit2KeyDown(Sender:TObject; var Key: Word;
   Shift: TShiftState);
begin
if key =vk_return then
label1.Caption :=IntToStr(max(StrToInt(Edit1.text),StrToInt(edit2.text)));

end;

end.

红色代码自己添加,其中external "dll_name"中的dll_name可以是dll的绝对路径,要是该dll文件在你的搜索路径中,可以直接写文件名,但是.dll不能少写

2、动态调用,代码如下;

unit Unit1;

interface

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

type
   TForm1 = class(TForm)
     Edit1: TEdit;
     Edit2: TEdit;
     Label1: TLabel;
     procedure Edit2KeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit2KeyDown(Sender:TObject; var Key: Word;
   Shift: TShiftState);
type
TFunc =function(x,y:integer):integer;stdcall;
var
Th:Thandle;
Tf:TFunc;
Tp:TFarProc;

begin
if key =vk_return then
begin

Th:=LoadLibrary('dll_0001.dll');    {load dll}
if(Th   >0) then
try
Tp :=GetProcAddress(Th,PChar('max'));
if(Tp <>nil) then
begin         { begin 1}
Tf :=TFunc(Tp);
Label1.Caption :=IntToStr(
Tf(StrToInt(Edit1.text),StrToInt(Edit2.text)));
end   { end 1}
else
   ShowMessage('function max not found.');
finally
FreeLibrary(Th);
end
else
ShowMessage('dll_0001.dll not exsit.');


end;
end;

end.

 

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录