电子文章 | 电子资料下载 | 家电维修 | 维修资料下载 | 加入收藏 | 全站地图
您现在所在位置:电子爱好者电子文章嵌入式系统如何用Delphi编写dll文件

如何用Delphi编写dll文件

11-20 17:13:35 | http://www.5idzw.com | 嵌入式系统 | 人气:374
标签:嵌入式系统开发,嵌入式开发,http://www.5idzw.com 如何用Delphi编写dll文件,http://www.5idzw.com

如何用Delphi编写dll文件

一、开使你的第一个DLL专案
  1.File->Close all->File->New﹝DLL﹞

代码:


  //自动产生Code如下

library Project2;
  //这有段废话
  uses
  SysUtils,
  Classes;

  {$R *.RES}

  begin
  end.


  2.加个Func进来:
  代码:


  library Project2;
  uses
  SysUtils,
  Classes;

Function MyMax ( X , Y : integer ) : integer ; stdcall ;
begin
if X > Y then
Result := X
else
Result := Y ;
end ;
//切记:Library 的名字大小写没关系,可是DLL-Func的大小写就有关系了。
// 在 DLL-Func-Name写成MyMax与myMAX是不同的。如果写错了,立即
// 的结果是你叫用到此DLL的AP根本开不起来。
//参数的大小写就没关系了。甚至不必同名。如原型中是 (X,Y:integer)但引
// 用时写成(A,B:integer),那是没关系的。
//切记:要再加个stdcall。书上讲,如果你是用delphi写DLL,且希望不仅给
// delphi-AP也希望BCB/VC-AP等使用的话,那你最好加个Stdcall ; 的指示
//参数型态:delphi有很多种它自己的变量型态,这些当然不是DLL所喜欢的
// ,Windows/DLL的母语应该是C。所以如果要传进传出DLL的参数,我们
// 尽可能照规矩来用。这两者写起来,后者会麻烦不少。如果你对C不熟
// 的话,那也没关系。我们以后再讲。

  {$R *.RES}

  begin
  end.



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


  {$R *.RES}
  exports
  MyMax ;
  begin
  end.



  4.好了,可以按 Ctrl-F9编译了。此时可不要按F9。DLL不是EXE┌不可单独执行的,如果你按F9,会有ErrorMsg的。这时如果DLL有Error,请修正之。再按Ctrl-F9。此时可能有Warning,不要紧,研究一下,看看就好。再按Ctrl-F9,此时就『Done , Compiled 』。同目录就会有个 *.dll 。恭喜,大功告成了。

二、进行测试:开个新application:
  1.加个TButton
  代码:


  ShowMessage ( IntToStr(MyMax(30,50)) ) ;



  2.告知Exe到那里抓个Func
  代码:


  //在Form,interface,var后加
  Function MyMax ( X , Y : integer ) : integer ; stdcall ; external 'MyTestDLL.dll' ;
  // MyTestDLL.dll为你前时写的DLL项目名字
  // DLL名字大小写没关系。不过记得要加 extension的 .DLL。在Win95或NT,
  // 是不必加 extension,但这两种OS,可能越来越少了吧。要加extension


  可以了,简单吧。


  上面的例子是不是很简单?熟悉delphi的朋友可以看出以上代码和一般的delphi程序的编写基本是相同的,只是在TestDll函数后多了一个stdcall参数并且用exports语句声明了TestDll函数。只要编译上面的代码,就可以玫揭桓雒 狣elphi.dll的动态链接库。现在,让我们来看看有哪些需要注意的地方:

  1.在DLL中编写的函数或过程都必须加上stdcall调用参数。在delphi 1或delphi 2环境下该调用参数是far。从delphi 3以后将这个参数变为了stdcall,目的是为了使用标准的Win32参数传递技术来代替优化的register参数。忘记使用stdcall参数是常见的错误,这个错误不会影响DLL的编译和生成,但当调用这个DLL时会发生很严重的错误,导致操作系统的死锁。原因是register参数是delphi的默认参数。

  2.所写的函数和过程应该用exports语句声明为外部函数。
  正如大家看到的,TestDll函数被声明为一个外部函数。这样做可以使该函数在外部就能看到,具体方法是单激鼠标右键用“快速查看(Quick View)”功能查看该DLL文件。(如果没有“快速查看”选项可以从Windows CD上安装。)TestDll函数会出现在Export Table栏中。另一个很充分的理由是,如果不这样声明,我们编写的函数将不能被调用,这是大家都不愿看到的。

  3.当使用了长字符串类型的参数、变量时要引用ShareMem。
  delphi中的string类型很强大,我们知道普通的字符串长度最大为256个字符,但delphi中string类型在默认情况下长度可以达到2G。(对,您没有看错,确实是两兆。)这时,如果您坚持要使用string类型的参数、变量甚至是记录信息时,就要引用ShareMem单元,而且必须是第一个引用的。既在uses语句后是第一个引用的单元。如下例:


  uses
  ShareMem,
  SysUtils,
  Classes;


  还有一点,在您的工程文件(*.dpr)中而不是单元文件(*.pas)中也要做同样的工作,这一点delphi自带的帮助文件没有说清楚,造成了很多误会。不这样做的话,您很有可能付出死机的代价。避免使用string类型的方法是将string类型的参数、变量等声明为Pchar或ShortString(如:s:string[10])类型。同样的问题会出现在当您使用了动态数组时,解决的方法同上所述。

Delphi DLL动态链库编写教程

Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝。动态链接库就是在这种情况下出现的。动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可以被系统中的任何正在运行的应用程序软件所使用,而不必再将DLLs函数的另一拷贝装入内存。 任何应用程序都可以共享由装入内存的DLLs管理的内存资源块。只包含共享数据的DLLs称为资源文件。

1.一般工程文件的头标用program关键字,而DLLs工程文件头标用library 关键字。不同的关键字通知编译器生成不同的可执行文件。用program关键字生成的是.exe文件,而用library关键字生成的是.dll文件;

  2.假如DLLs要输出供其它应用程序使用的函数或过程,则必须将这些函数或过程列在exports子句中。而这些函数或过程本身必须用export编译指令进行编译。

  根据DLLs完成的功能,我们把DLLs分为如下的三类:

1.完成一般功能的DLLs;2.用于数据交换的DLLs;3.用于窗体重用的DLLs。

一 Dll的制作一般分为以下几步:

1 在一个DLL工程里写一个过程或函数

2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。

二 参数传递

1 参数类型最好与window C++的参数类型一致。最好少用DELPHI的数据类型。

2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。

3 用stdcall声明后缀。

4 最好大小写敏感。

5 无须用far调用后缀,那只是为了与windows 16位程序兼容。

三 DLL的初始化和退出清理[如果需要初始化和退出清理]

1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下:

procedurefar;stdcall;

dwReason参数有四种类型:

DLL_PROCESS_ATTACH:进程进入时       DLL_PROCESS_DETACH进程退出时

DLL_THREAD_ATTACH 线程进入时        DLL_THREAD_DETACH 线程退出时  

在初始化部分写:

DLLProc := @DLLEnterPoint;

DllEnterPoint(DLL_PROCESS_ATTACH);

2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil);

3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。

[1] [2] [3] [4]  下一页

,如何用Delphi编写dll文件
上一篇:流量计算机
关于《如何用Delphi编写dll文件》的更多文章