您的位置:首页 > 编程语言 > Delphi

用Delphi制作DLL

2008-06-01 10:03 323 查看
[align=center]手把手教delphi:写你的dll文件[/align]
一、开使你的第一个DLL专案
  1.File->Close all->File->New﹝DLL﹞
[align=left]代码:[/align]

[align=left]  Code如下library Project2;
  
  SysUtils,
  {$R *.RES}

  end.[/align]
[align=left]  2.加个Func进来:
  代码:[/align]

[align=left]  uses
  Classes;

Function MyMax ( X , Y : integer ) : integer ; stdcall ;
begin
if X > Y then
Result := X
else
Result := Y ;
end ;
//切记:DLL-Func的大小写就有关系了。 DLL-Func-Name写成myMAX是不同的。如果写错了,立即DLL的
//参数的大小写就没关系了。甚至不必同名。如原型中是
// 用时写成
//切记:要再加个Delphi写
// Delphi-AP也希望Stdcall ; 的指示Delphi有很多种它自己的变量型态,这些当然不是
// ,C。所以如果要传进传出
// 尽可能照规矩来用。这两者写起来,后者会麻烦不少。如果你对
// 的话,那也没关系。我们以后再讲。{$R *.RES}

  end.[/align]
[align=left]  3.将这些可共享的Func送出DLL,让外界﹝就是你的Delphi-AP啦﹞使用:光如此,你的AP还不能用到这些,你还要加个Exports才行。
  代码: [/align]

[align=left]  exports
  begin
  ShowMessage ( IntToStr(MyMax(30,50)) ) ;[/align]
[align=left]  2.告知Exe到那里抓个Func
  代码:[/align]

[align=left]  Form,interface,var后加Function MyMax ( X , Y : integer ) : integer ; stdcall ; external 'MyTestDLL.dll' ;
  DLL项目名字// DLL名字大小写没关系。不过记得要加 .DLL。在NT,// 是不必加OS,可能越来越少了吧。要加uses
  本行以下代码为我们真正动手写的代码
function TestDll(i:integer):integer;stdcall;
external ’Delphi.dll’;

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

end.
[align=left]上面的例子中我们在窗体上放置了一个编辑框(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文件”等运行错误。 [/align]
[align=left]Delphi中动态调用DLL
  动态调用DLL相对复杂很多,但非常灵活。为了全面的说明该问题,这次我们举一个调用由C++编写的DLL的例子。首先在C++中编译下面的DLL源程序。 [/align]

[align=left]procedure TForm1.Button1Click(Sender: TObject);
type
TIntFunc=function(i:integer):integer;stdcall;
var
Th:Thandle;
Tf:TIntFunc;
Tp:TFarProc;
begin
Th:=LoadLibrary(’Cpp.dll’); {装载 begin
Tf:=TIntFunc(Tp);
Edit1.Text:=IntToStr(Tf(1)); {调用}
end
else
ShowMessage(’TestC函数没有找到DLL}
end
else
ShowMessage(’Cpp.dll没有找到function TestC(i:integer):integer;stdcall;
external ’Cpp.dll’;name ’@TestC$s’;[/align]
[align=left]其中name的作用就是重命名。
  2 、可把我们编写的DLL放到Windows目录下或者Windows\system目录下。这样做可以在external语句中或LoadLibrary语句中不写路径而只写DLL的名称。但这样做有些不妥,这两个目录下有大量重要的系统DLL,如果您编的DLL与它们重名的话其后果简直不堪设想,况且您的编程技术还不至于达到将自己编写的DLL放到系统目录中的地步吧!
三、调试技巧
  1 、我们知道DLL在编写时是不能运行和单步调试的。有一个办法可以,那就是在Run|parameters菜单中设置一个宿主程序。在Local页的Host Application栏中添上宿主程序的名字就可进行单步调试、断点观察和运行了。
  2 、添加DLL的版本信息。开场白中提到了版本信息对于DLL是很重要的,如果包含了版本信息,DLL的大小会增加2Kb。增加这么一点空间是值得的。很不幸我们如果直接使用Project|options菜单中Version选项是不行的,这一点Delphi的帮助文件中没有提到,经笔者研究发现,只要加一行代码就可以了。如下例: [/align]

[align=left]

function TestDll(i:integer):integer;stdcall;
begin
Result:=i;
end;

exports
TestDll;

begin
end.[/align]
3 、为了避免与别的DLL重名,在给自己编写的DLL起名字的时候最好采用字符数字和下划线混合的方式。如:jl_try16.dll。
  4 、如果您原来在Delphi 1或Delphi 2中已经编译了某些DLL的话,您原来编译的DLL是16位的。只要将源代码在新的Delphi 3或Delphi 4环境下重新编译,就可以得到32位的DLL了。

[后记]除了上面介绍的DLL最常用的使用方法外,DLL还可以用于做资源的载体。例如,在Windows中更改图标就是使用的DLL中的资源。另外,熟练掌握了DLL的设计技术,对使用更为高级的OLE、COM以及ActiveX编程都有很多益处。

[align=center]对使用Delphi制作DLL复用文件的建议[/align]
[align=center][/align]
在公司里有一些需要制作DLL的场合,因为熟悉、方便和简易,大多数使用Delphi来制作。现在就这个主题提出一些个人建议。接口。指的是传递的参数类型及函数返回类型不能是string),以及动态数组和含有这些类型成员的复合类型(如记录),也不能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了Delphi但调用方或被调用方没有在工程文件的第一包含单元不是
应用程序,则可能可以使用不包含禁止类型(
程序,而且要使用ShareMem程序的情况可能与此相同,不过没有测试过。)Delphi、动态数组、包含
的复用范围,避免可能存在的错误,应当使用标准string转换。动态数组则转换为指针类型(
程序,为了编写方便,不想进行上述转换,则推荐使用运行时包的形式。运行时包可以保证动态分配数据的正确释放。这样因为其扩展名(Delphi/C++Builder)。overload过程作输出,如果同一操作有多个方式,则可以让函数Delphi、CreateByDefaultFile, CreateDefault  最后,作为Delphi或.pas及.h。而不是让使用者们自己创建。如果非要有/应用,提供的external中的输出函数),也可以是后期连接的(使用GetProcAddress提供者提供编程接口文件,既显得正式(或
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 DLL 休闲