知识大全 Delphi学堂之用Delphi制作DLL小结

Posted 函数

篇首语:饱带饥粮,晴带雨伞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi学堂之用Delphi制作DLL小结相关的知识,希望对你有一定的参考价值。

Delphi学堂之用Delphi制作DLL小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

一 Dll的制作一般分为以下几步    在一个DLL工程里写一个过程或函数   写一个Exports关键字 在其下写过程的名称 不用写参数和调用后缀     二 参数传递   参数类型最好与window C++的参数类型一致 不要用DELPHI的数据类型    最好有返回值[即使是一个过程] 来报出调用成功或失败 或状态 成功或失败的返回值最好为 [成功]或 [失败] 一句话 与windows c++兼容    用stdcall声明后缀    最好大小写敏感    无须用far调用后缀 那只是为了与windows 位程序兼容     三 DLL的初始化和退出清理[如果需要初始化和退出清理   DLLProc[SysUtils单元的一个Pointer]是DLL的入口 在此你可用你的函数替换了它的入口 但你的函数必须符合以下要求[其实就是一个回调函数] 如下   procedure DllEnterPoint(dwReason: DWORD);far;stdcall;  dwReason参数有四种类型   DLL_PROCESS_ATTACH:进程进入时  DLL_PROCESS_DETACH进程退出时  DLL_THREAD_ATTACH 线程进入时  DLL_THREAD_DETACH 线程退出时  在初始化部分写:  DLLProc := @DLLEnterPoint;  DllEnterPoint(DLL_PROCESS_ATTACH);   如Form上有TdConnection组件 就Uses Activex 在初始化时写一句CoInitialize (nil);   在退出时一定保证DConnection Connected := False 并且数据集已关闭 否则报地址错     四 全局变量的使用  在widnows 位程序中 两个应用程序的地址空间是相互没有联系的 虽然DLL在内存中是一份 但变量是在各进程的地址空间中 因此你不能借助dll的全局变量来达到两个应用程序间的数据传递 除非你用内存映像文件     五 调用静态载入   客户端函数声名:   )大小写敏感    )与DLL中的声明一样   如 showform(form:Tform);Far;external yproject_dll dll ;   )调用时传过去的参数类型最好也与windows c++一样    )调用时DLL必须在windows搜索路径中 顺序是 当前目录 Path路径 windows;widows\\system;windows\\ssystem ;    六 调用动态载入   建立一种过程类型[如果你对过程类型的变量只是一个指针的本质清楚的话 你就知道是怎么回事了] 如   type  mypointer=procedure(form:Tform);Far;external;  var  Hinst:Thandle;  showform:mypointer;  begin  Hinst:=loadlibrary( yproject_dll );//Load一个Dll 按文件名找   showform:=getprocaddress(Hinst showform );//按函数名找 大小写敏感 如果你知道自动化对象的本质就清楚了   showform(application mainform);//找到函数入口指针就调用   Freelibrary(Hinst);  end;    七 在DLL建立一个TForM   把你的Form Uses到Dll中 你的Form用到的关联的单元也要Uses进来[这是最麻烦的一点 因为你的Form或许Uses了许多特殊的单元或函数]   传递一个Application参数 用它建立Form     八 在DLL中建立一个TMDIChildForM   Dll中的MDIForm FormStyle不用为fmMDIChild    在CreateForm后写以下两句   function ShowForm(mainForm:TForm):integer;stdcall  var  Form : TForm ;  ptr:PLongInt;  begin  ptr:=@(Application MainForm);//先把dll的MainForm句柄保存起来 也无须释放 只不过是替换一下  ptr^:=LongInt(mainForm);//用主调程序的mainForm替换DLL的MainForm MainForm是特殊的WINDOW 它专门管理Application中的Forms资源   //为什么不直接Application MainForm := mainForm 因为Application MainForm是只读属性  Form :=TForm Create(mainForm);//用参数建立  end;  备注 参数是主调程序的Application MainForm    九 示例   DLL源代码   library Project ;    uses  SysUtils   Classes   Dialogs   Forms   Unit in Unit pas Form ;    $R * RES  var  ccc: Pchar;    procedure OpenForm(mainForm:TForm);stdcall;  var  Form : TForm ;  ptr:PLongInt;  begin  ptr:=@(Application MainForm);  ptr^:=LongInt(mainForm);  Form :=TForm Create(mainForm);  end;    procedure InputCCC(Text: Pchar);stdcall;  begin  ccc := Text;  end;    procedure ShowCCC;stdcall;  begin  ShowMessage(String(ccc));  end;    exports  OpenForm;  InputCCC   ShowCCC;  begin  end     调用方源代码   unit Unit ;    interface    uses  Windows Messages SysUtils Classes Graphics Controls Forms Dialogs   StdCtrls;    type  TForm = class(TForm)  Button : TButton;  Button : TButton;  Edit : TEdit;  procedure Button Click(Sender: TObject);  procedure Button Click(Sender: TObject);  private   Private declarations   public   Public declarations   end;    var  Form : TForm ;    implementation    $R * DFM  procedure OpenForm(mainForm:TForm);stdcall;External project dll ;  procedure ShowCCC;stdcall;External project dll ;  procedure InputCCC(Text: Pchar);stdcall;External project dll ;    procedure TForm Button Click(Sender: TObject);  var  Text: Pchar;  begin  Text := Pchar(Edit Text);  // OpenForm(Application MainForm);//为了调MDICHILD  InputCCC(Text);//为了实验DLL中的全局变量是否在各个应用程序间共享  end;    procedure TForm Button Click(Sender: TObject);  begin  ShowCCC;//这里表明WINDOWS 位应用程序DLL中的全局变量也是在应用程序地址空间中 位应用程序或许不同 没有做实验   end; cha138/Article/program/Delphi/201311/24661

相关参考

知识大全 Delphi学堂之在Delphi中自己建立交叉表

Delphi学堂之在Delphi中自己建立交叉表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!fu

知识大全 Dll 中导出类 --Delphi 实战[1]

Dll中导出类--Delphi实战[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从Dll

知识大全 Dll 中导出类 --Delphi 实战[2]

Dll中导出类--Delphi实战[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  暂不探讨

知识大全 Dll 中导出类 --Delphi 实战[3]

Dll中导出类--Delphi实战[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当然在该

知识大全 Delphi 中动态链接库(dll)的建立和使用[2]

Delphi中动态链接库(dll)的建立和使用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Delphi 中动态链接库(dll)的建立和使用[1]

Delphi中动态链接库(dll)的建立和使用[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Delphi中的Access技巧小结

Delphi中的Access技巧小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  DELPHI

知识大全 如何在Delphi中调用.Net编写的DLL中的函数

如何在Delphi中调用.Net编写的DLL中的函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Delphi基础开发技巧浅析

新手学堂:Delphi基础开发技巧浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!◇[DELPH

知识大全 用Delphi制作录音程序

用Delphi制作录音程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Delphi是Inpr