Delphi7怎么写dll函数?

zzyhost 2015-03-10 09:12:16
function a(s:string):string;
begin
result:=s;
end;
新建了一个dll工程后,我不知道在dll工程里写函数的格式是什么样的,就拿这个简单的函数举例,麻烦帮我写成一个标准的dll,代码最好写全,不要落下关键代码
...全文
214 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
goldqq 2015-03-11
  • 打赏
  • 举报
回复
去看一下万一的博客吧。。。 http://www.cnblogs.com/del/category/113550.html
qq_26495549 2015-03-11
  • 打赏
  • 举报
回复
引用 3 楼 qq_26495549 的回复:
[quote=引用 2 楼 lyhoo163 的回复:] 简单的dll,dll中只有一个max函数,返回2个数中的大数 1、New->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. 2、Delphl调用dll 调用dll分动态调用和静态调用2中,动态调用写起来简单,安全点,动态调用复杂很多,但很灵活; (1)new一个Application,在Form中放入2个TEdit、1个TLabek; (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} 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. (3)动态调用 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.
[/quote]
qq_26495549 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163 的回复:
简单的dll,dll中只有一个max函数,返回2个数中的大数 1、New->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. 2、Delphl调用dll 调用dll分动态调用和静态调用2中,动态调用写起来简单,安全点,动态调用复杂很多,但很灵活; (1)new一个Application,在Form中放入2个TEdit、1个TLabek; (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} 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. (3)动态调用 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.
lyhoo163 2015-03-11
  • 打赏
  • 举报
回复
简单的dll,dll中只有一个max函数,返回2个数中的大数 1、New->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. 2、Delphl调用dll 调用dll分动态调用和静态调用2中,动态调用写起来简单,安全点,动态调用复杂很多,但很灵活; (1)new一个Application,在Form中放入2个TEdit、1个TLabek; (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} 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. (3)动态调用 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.
tcmakebest 2015-03-11
  • 打赏
  • 举报
回复
DLL函数不适合返回 string 类型,应该用缓冲区,下面是用整数作例子:
/// unit1.pas

unit Unit1;

interface
function a(s:Integer):Integer; stdcall;

implementation

function a(s:Integer):Integer;
begin
    result:=s;
end;

end.

/// project1.dpr
library Project1;

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas';

{$R *.res}

exports a;

begin

end.

16,742

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧