关于怎样写出DLL的问题!?高手帮我! 我经常看到人家的程序里有DLL文件,我怎样写出DLL文件呢?希望哪位大虾能给我一个例子![email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用向导建立一个DLL的工程,然后弄一些引出函数就可以了啊!用DLL不一定有好处。1、加大了编程复杂2、静态连接的DLL的效率不比单一的Exe高,甚至效率更低。3、需要防止DLL名字冲突,和别人开发的软件的DLL有可能重名,特别是打算放到System32里面的时候。用DLL的理由。1、更换DLL的版本就可以更新程序,这一点看起来也并不是特别突出。2、不同的工作小组之间可以进行分工,对于大的项目适合,小的项目意义不大,分工嘛!可以在源代码级别上的。3、exe启动快一点,4、可以公用代码,自己写的软件很少会和别人的软件共享的。其实你看到的很多软件包含DLL,因为这些DLL不是他们开发的,是他们问别人购买的,别人不可能提供源代码,通常提供DLL或者com(通常也封装成DLL)。绝大多数的大型软件开发的时候,都要购买别人开发的函数库或者组件。呵呵,DLL越多,说明他们买得越多,自己开发的越少。呵呵。 还忘了一点,有些系统服务的使用必须用DLL,比如Hook,就必须用DLL,还有一些驱动程序也必须用DLL,还有的Com组件也必须用DLL的形式,这是没有办法,所以才会包含一些DLL的。 其实和你开发别的程序的方式都一样的,不过要有导出过程,即 imports... end; 转贴一篇!在Delphi应用程序中使用DLL Delphi与VisualBasic、VisualFoxPro等软件一样,属于RAD工具(快速应用开发工具)。适合开发32位或16位/32位混合应用程序。Delphi所使用的程序语言是ObjectPascal,是结构化、面向对象的编译型语言,具有高执行效率、可重用性、易维护性,及较强的异常处理能力、类封装能力等。VB与Delphi相比,VB不能对程序进行编译,只能解释执行,更重要的不同是Delphi具有较强的继承性,Delphi的应用程序可编译DLL模块,VB却无法编译,只能调用C编译的DLL。而Delphi不仅可调用C++产生的DLL模块,同样C++程序也可调用Delphi所产生的DLL部件。这样交互调用,无须重复开发,大大缩短了生产周期。一、用Delphi创建DLL Delphi的DLL创建并不复杂,下面向大家介绍Delphi的DLL创建方法。 1、首先创建一个新的DLL项目(NewProject),因为DLL与调用它的主程序要分开编译。如果DLL模块已经建立在调用它的项目中(Project),则将它的窗体(Form)从Project移出,另建一个新的项目(NewProject)。只需从File菜单选中NewProject项,然后将DLL的Pas模块文件加入到项目中,再将其自动建立的Form1删除即可。 2、在DLL的DPR文件中把Program关键字改为Library,申明为动态链接库,在USES语句后面加入ExPorts语句,指明调用DLL的函数名。 3、如果主程序的DPR文件已有DLL窗体CreateForm的语句,则将其去掉。 4、在DLL的Pas文件中Type......End后加入该DLL的函数或过程的声明,形式如: FunctionName(argment):Boolean;export; 该函数或过程应加入窗体的Create和Free(产生和释放)方法。 5、对项目进行编译即可。二、DLL的调用 调用DLL有两种方法,一种是在应用程序装载时调用,另一种是在应用程序运行时调用。首先介绍装载时DLL的调用: (1)装载时调用DLL 在调用DLL的Pas文件中,对DLL函数进行外部声明,声明应位于Implementation的Uses语句后,形式如下: Implementation Uses Dialogs; Function Name(argment):Boolean;far;External 'CallName'; ...... 其中External关键字后面的引号内的字串是DLL的文件名。声明以后即可在Pas文件任何地方引用DLL函数。 装载时调用DLL的优点是速度较快,程序间也可共享代码。 (2)运行时调用DLL DLL的另一种调用方法是在运行时调用。要调用到Windows的API函数:LoadLibrary,GetProcAddress等。主要用于调用DELPHI和其它语言,特别是C++编译的DLL。 假定你的DLL包括一个函数: Function MyFunc(aparam:word):string;export; 首先在程序Type类型声明处加入一句: Type TMyfunc = function(aparam:word):string; 此句的作用如同C++中声明的函数指针。 然后定义如下变量∶ Var aptr:TFarproc; lhnd:THandle; s:string; 其中Aptr,lhnd两变量声明必须有,s是DLL函数返回值,视情况而定。 在调用DLL处加入如下语句进行DLL装载: lhnd:=Loadlibrary('路径:DLL文件名');{如lhnd:=Loadlibrary('c:\aa\bb.dll'); aptr:=GetprocAddress(lhnd,'Myfunc'); 下面可直接调用DLL了: s:=TMyfunc(bptr)(60);{根据函数填相应的变量参数} 调用完以后,用FreeLibrary释放DLL占用的内存: FreeLibrary(lhnd); 下面给出一个DLL的创建以及运行时调用的示例,该DLL主要用来检查输入的口令是否正确,窗体含有一个Edit编辑框,两个按钮Button,一个标签Label,在编辑框内输入口令,根据比较结果返回真假值。 {main.pas主程序(运行时调用DLL)} unitMain; interface uses WinTypes,WinProcs,Classes,Graphics,Forms,Controls,StdCtrls,ExtCtrls; type TForm1= class(TForm) Edit1:TEdit; Label1:TLabel; Button1:TButton; Bevel1:TBevel; GroupBox1:TGroupBox; StatusLbl:TLabel; procedure Button1Click(Sender:TObject); end; TGetPass=function(aa:string):boolean; //函数声明 var //全局变量声明 Form1:TForm1; getpass:TGetpass; lhnd:THandle; aptr:TFarProc; implementation uses Dialogs; {$R*.DFM} {Import routine from DLL.Takes password to match and returns boolean .} {function GetPassword(Password:string):Boolean;far;external'CHKPWORD';} {Call password check routine,show status information.} procedure TForm1.Button1Click(Sender:TObject); begin if Edit1.Text = ''then begin MessageDlg('Enter sample password first',mtInformation,[mbOK],0); Edit1.SetFocus; end else begin lhnd := LoadLibrary('Chkpword.dll'); //运行的时候调用Chkpword.DLL aptr:= GetProcAddress(lhnd,'GetPassword'); //DLLZ的函数名称为GetPassword if TGetPass(aptr)(Edit1.Text) then //对DLL进行调用 StatusLbl.Caption := 'Verified password' else StatusLbl.Caption := 'Invalid password'; freelibrary(lhnd); //释放 end; end. {dllform.pasDLL模块} unit Dllform; interface uses WinTypes,WinProcs,Classes,Graphics,Forms,Controls,Buttons,SysUtils,StdCtrls; type TPasswordForm = class(TForm) Edit1:TEdit; Label1:TLabel; BitBtn2:TBitBtn; BitBtn1:TBitBtn; end; function GetPassword(Password:string):Boolean;export; implementation uses Dialogs; {$R*.DFM} functionGetPassword(Password:string):Boolean; var PasswordForm:TPasswordForm; begin Result:=False; PasswordForm:=TPasswordForm.Create(Application); try with PasswordForm do if ShowModal=mrOK then if UpperCase(Edit1.Text)<> UpperCase(Password)then MessageDlg('InvalidPassword',mtWarning,[mbOK],0) else Result:=True; finally PasswordForm.Free; end; end; end. 为什么在程序中加载了N个DLL文件后,退出却有点慢 这是什么控件,如何实现 有关动态菜单加载?在线等?急急? 象oicq的信息编辑器一样,可同时编辑图片和文件的编辑器怎么做? 为什么通不过呢???帮帮忙看一下!!!! 有没有DOS很熟的仁兄?纯DOS下和WIN NT4.0联网 不是MDI窗体,能否将主、子窗体合并? 请教取得自从开机到现在CPU运行的周期数 三层结构 存储blob失败? 告急 —— 大侠们帮忙,在线等 delphi程序如何打包? 菜鸟说:这个问题真菜! 使用sndPlaySound或PlaySound播放wav文件, 怎么知道文件已经播放完毕?
2、静态连接的DLL的效率不比单一的Exe高,甚至效率更低。
3、需要防止DLL名字冲突,和别人开发的软件的DLL有可能重名,特别是打算放到System32里面的时候。用DLL的理由。
1、更换DLL的版本就可以更新程序,这一点看起来也并不是特别突出。
2、不同的工作小组之间可以进行分工,对于大的项目适合,小的项目意义不大,分工嘛!可以在源代码级别上的。
3、exe启动快一点,
4、可以公用代码,自己写的软件很少会和别人的软件共享的。其实你看到的很多软件包含DLL,因为这些DLL不是他们开发的,是他们问别人购买的,别人不可能提供源代码,通常提供DLL或者com(通常也封装成DLL)。绝大多数的大型软件开发的时候,都要购买别人开发的函数库或者组件。呵呵,DLL越多,说明他们买得越多,自己开发的越少。呵呵。
imports
...
end;
是ObjectPascal,是结构化、面向对象的编译型语言,具有高执行效率、可重用性、易维护性,及较强的异常处理能力、类封装能力等。VB与Delphi相比,VB不
能对程序进行编译,只能解释执行,更重要的不同是Delphi具有较强的继承性,Delphi的应用程序可编译DLL模块,VB却无法编译,只能调用C编译的DLL。而
Delphi不仅可调用C++产生的DLL模块,同样C++程序也可调用Delphi所产生的DLL部件。这样交互调用,无须重复开发,大大缩短了生产周期。一、用Delphi创建DLL Delphi的DLL创建并不复杂,下面向大家介绍Delphi的DLL创建方法。 1、首先创建一个新的DLL项目(NewProject),因为DLL与调用它的主程序要分开编译。如果DLL模块已经建立在调用它的项目中(Project),则将它的窗体
(Form)从Project移出,另建一个新的项目(NewProject)。只需从File菜单选中NewProject项,然后将DLL的Pas模块文件加入到项目中,再将其自动建立的
Form1删除即可。 2、在DLL的DPR文件中把Program关键字改为Library,申明为动态链接库,在USES语句后面加入ExPorts语句,指明调用DLL的函数名。 3、如果主程序的DPR文件已有DLL窗体CreateForm的语句,则将其去掉。 4、在DLL的Pas文件中Type......End后加入该DLL的函数或过程的声明,形式如: FunctionName(argment):Boolean;export; 该函数或过程应加入窗体的Create和Free(产生和释放)方法。 5、对项目进行编译即可。二、DLL的调用 调用DLL有两种方法,一种是在应用程序装载时调用,另一种是在应用程序运行时调用。首先介绍装载时DLL的调用: (1)装载时调用DLL 在调用DLL的Pas文件中,对DLL函数进行外部声明,声明应位于Implementation的Uses语句后,形式如下: Implementation Uses Dialogs; Function Name(argment):Boolean;far;External 'CallName'; ...... 其中External关键字后面的引号内的字串是DLL的文件名。声明以后即可在Pas文件任何地方引用DLL函数。 装载时调用DLL的优点是速度较快,程序间也可共享代码。 (2)运行时调用DLL DLL的另一种调用方法是在运行时调用。要调用到Windows的API函数:LoadLibrary,GetProcAddress等。主要用于调用
DELPHI和其它语言,特别是C++编译的DLL。 假定你的DLL包括一个函数: Function MyFunc(aparam:word):string;export; 首先在程序Type类型声明处加入一句: Type
TMyfunc = function(aparam:word):string; 此句的作用如同C++中声明的函数指针。 然后定义如下变量∶ Var
aptr:TFarproc;
lhnd:THandle;
s:string; 其中Aptr,lhnd两变量声明必须有,s是DLL函数返回值,视情况而定。 在调用DLL处加入如下语句进行DLL装载:
lhnd:=Loadlibrary('路径:DLL文件名');{如lhnd:=Loadlibrary('c:\aa\bb.dll');
aptr:=GetprocAddress(lhnd,'Myfunc'); 下面可直接调用DLL了:
s:=TMyfunc(bptr)(60);{根据函数填相应的变量参数} 调用完以后,用FreeLibrary释放DLL占用的内存:
FreeLibrary(lhnd); 下面给出一个DLL的创建以及运行时调用的示例,该DLL主要用来检查输入的口令是否正确,窗体含有一个Edit
编辑框,两个按钮Button,一个标签Label,在编辑框内输入口令,根据比较结果返回真假值。
{main.pas主程序(运行时调用DLL)} unitMain; interface
uses WinTypes,WinProcs,Classes,Graphics,Forms,Controls,StdCtrls,ExtCtrls; type TForm1= class(TForm)
Edit1:TEdit;
Label1:TLabel;
Button1:TButton;
Bevel1:TBevel;
GroupBox1:TGroupBox;
StatusLbl:TLabel;
procedure Button1Click(Sender:TObject);
end; TGetPass=function(aa:string):boolean; //函数声明 var //全局变量声明
Form1:TForm1;
getpass:TGetpass;
lhnd:THandle;
aptr:TFarProc; implementation
uses Dialogs; {$R*.DFM} {Import routine from DLL.Takes password to match and returns boolean .} {function GetPassword(Password:string):Boolean;far;external'CHKPWORD';} {Call password check routine,show status information.} procedure TForm1.Button1Click(Sender:TObject);
begin
if Edit1.Text = ''then
begin
MessageDlg('Enter sample password first',mtInformation,[mbOK],0);
Edit1.SetFocus;
end
else begin
lhnd := LoadLibrary('Chkpword.dll'); //运行的时候调用Chkpword.DLL
aptr:= GetProcAddress(lhnd,'GetPassword'); //DLLZ的函数名称为GetPassword
if TGetPass(aptr)(Edit1.Text) then //对DLL进行调用
StatusLbl.Caption := 'Verified password'
else
StatusLbl.Caption := 'Invalid password';
freelibrary(lhnd); //释放
end; end.
{dllform.pasDLL模块}
unit Dllform; interface
uses WinTypes,WinProcs,Classes,Graphics,Forms,Controls,Buttons,SysUtils,StdCtrls; type TPasswordForm = class(TForm)
Edit1:TEdit;
Label1:TLabel;
BitBtn2:TBitBtn;
BitBtn1:TBitBtn;
end; function GetPassword(Password:string):Boolean;export; implementation
uses Dialogs; {$R*.DFM}
functionGetPassword(Password:string):Boolean;
var
PasswordForm:TPasswordForm;
begin
Result:=False;
PasswordForm:=TPasswordForm.Create(Application);
try
with PasswordForm do
if ShowModal=mrOK then
if UpperCase(Edit1.Text)<> UpperCase(Password)then
MessageDlg('InvalidPassword',mtWarning,[mbOK],0)
else
Result:=True;
finally
PasswordForm.Free;
end;
end; end.