用Delphi制作DLL

Delphi制作DLL  
 Dll的制作一般步骤  
 参数传递  
 DLL的初始化和退出清理[如果需要初始化和退出清理]  
 全局量的使用  
 用静态载  
 动态载  
 DLL建立一个TForM  
 DLL中建立一个TMDIChildForM  
 示例:  
 Delphi制作的Dll与其他言的混合程中常遇问题  
十一  关资  
 
 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的入口。在此你可用你的函数替了它的入口。但你的函数必符合以下要求[就是一个回函数]。如下:  
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);  
2  
Form上有TdcomConnection,Uses  Activex,在初始化写一句CoInitialize  (nil);  
3  
在退出一定保DcomConnection.Connected  :=  False,并且数据集已关闭。否则报地址  
 
 全局量的使用  
widnows  32位程序中,两个用程序的地址空是相互没有系的。DLL在内存中是一份,但量是在各程的地址空中,因此你不能借助dll的全局量来达到两个用程序的数据传递,除非你用内存映像文件。  
 
 用静态载  
1  
端函数声名:  
1)
大小写敏感。  
2)
DLL中的声明一  
     
如:  showform(form:Tform);Far;external'yproject_dll.dll';  
3)
时传过去的参数型最好也与windows  c++  
4)
DLLwindows搜索路径中,序是:当前目Path路径;windows;widows/system;windows/ssystem32;  
 
 动态载  
1  
建立一种过[如果你对过型的量只是一个指的本清楚的,你就知道是怎回事了]。如:  
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  
1  
把你的Form  UsesDll中,你的Form用到的关联元也要Uses[是最麻的一点,因你的FormUses多特殊的元或函数]  
2  
传递一个Application参数,用它建立Form.  
 
 DLL中建立一个TMDIChildForM  
1  Dll
中的MDIForm.FormStyle不用fmMDIChild.  
2  
CreateForm后写以下两句:  
function  ShowForm(mainForm:TForm):integer;stdcall  
var  
   Form1:  TForm1;  
   ptr:PLongInt;  
begin  
   ptr:=@(Application.MainForm);//
先把dllMainForm句柄保存起来,也无须释放,只不是替一下  
   ptr^:=LongInt(mainForm);//
用主程序的mainFormDLLMainFormMainForm是特殊的WINDOW,它专门管理Application中的Forms.  
//
不直接Application.MainForm  :=  mainForm,Application.MainForm是只属性  
   Form1:=TForm1.Create(mainForm);//
用参数建立  
end;  
注:参数是主程序的Application.MainForm  
 
 示例:  
DLL
源代  
library  Project2;  
 
uses  
   SysUtils,  
   Classes,  
   Dialogs,  
   Forms,  
   Unit2  in  'Unit2.pas'  {Form2};  
 
{$R  *.RES}  
var  
   ccc:  Pchar;  
 
procedure  OpenForm(mainForm:TForm);stdcall;  
var  
   Form1:  TForm1;  
   ptr:PLongInt;  
begin  
   ptr:=@(Application.MainForm);  
   ptr^:=LongInt(mainForm);  
   Form1:=TForm1.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  Unit1;  
 
interface  
 
uses  
   Windows,  Messages,  SysUtils,  Classes,  Graphics,  Controls,  Forms,  Dialogs,  
   StdCtrls;  
 
type  
   TForm1  =  class(TForm)  
       Button1:  TButton;  
       Button2:  TButton;  
       Edit1:  TEdit;  
       procedure  Button1Click(Sender:  TObject);  
       procedure  Button2Click(Sender:  TObject);  
   private  
       {  Private  declarations  }  
   public  
       {  Public  declarations  }  
   end;  
 
var  
   Form1:  TForm1;  
 
implementation  
 
{$R  *.DFM}  
procedure  OpenForm(mainForm:TForm);stdcall;External'project2.dll';  
procedure  ShowCCC;stdcall;External'project2.dll';  
procedure  InputCCC(Text:  Pchar);stdcall;External'project2.dll';  
 
procedure  TForm1.Button1Click(Sender:  TObject);  
var  
   Text:  Pchar;  
begin  
   Text  :=  Pchar(Edit1.Text);  
//    OpenForm(Application.MainForm);//
MDICHILD  
   InputCCC(Text);//
实验DLL中的全局量是否在各个用程序共享  
end;  
 
procedure  TForm1.Button2Click(Sender:  TObject);  
begin  
   ShowCCC;//
里表明WINDOWS  32用程序DLL中的全局量也是在用程序地址空中,16用程序或不同,没有做实验  
end;  
 
 Delphi制作的Dll与其他言的混合程中常遇问题  
1  
PowerBuilder混合  
   
在定不定长动态方面在函数退出清理堆栈时老出不可重的地址,原因未明,大概与PB编译器原理有,即使PB编译成二制代也如此

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值