delphi编写调用有窗体有返回值的dll的实现方1.doc

上传人:ni****g 文档编号:557439157 上传时间:2024-01-29 格式:DOC 页数:8 大小:51.50KB
返回 下载 相关 举报
delphi编写调用有窗体有返回值的dll的实现方1.doc_第1页
第1页 / 共8页
delphi编写调用有窗体有返回值的dll的实现方1.doc_第2页
第2页 / 共8页
delphi编写调用有窗体有返回值的dll的实现方1.doc_第3页
第3页 / 共8页
delphi编写调用有窗体有返回值的dll的实现方1.doc_第4页
第4页 / 共8页
delphi编写调用有窗体有返回值的dll的实现方1.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《delphi编写调用有窗体有返回值的dll的实现方1.doc》由会员分享,可在线阅读,更多相关《delphi编写调用有窗体有返回值的dll的实现方1.doc(8页珍藏版)》请在金锄头文库上搜索。

1、delphi编写调用有窗体有返回值的dll的实现方法本人使用的delphi是5.0版,用delphi编写dll工程很简单,在新建。中就有创建Dll的选项。在编写DLL工程时,需要注意的包括,工程单元有很大差异,一个关键字是program ,一个关键字是library。dll工程单元中还包括 exports 子句,那些需要提供给其他主叫程序调用的过程,都需要包括在exports中(只是列出函数的名字,不需要参数表)。对于主叫方(调用dll的应用程序或者其他dll),则需要在调用之前进行外部声明,即external保留字指示的声明。另外需要了解object pascal中有关调用协议的内容,在ob

2、ject pascal中对于过程或函数有以下五种调用协议:指示字 参数传递顺序 参数清除者 参数是否使用寄存器register 自左向右 被调例程 是pascal 自左向右 被调例程 否cdecl 自右向左 调用者 否stdcall 自右向左 被调用例程 否safecall 自右向左 被调用例程 否这里的指示字就是在声明函数或过程时附加在例程标题之后的保留字,默认为register,即是 唯一使用 CPU寄存器的参数传递方式,也是传递速度最快的方式; pascal: 调用协议仅用于向后兼容,即向旧的版本兼容;cdecl: 多用于 C和 C+语言编写的例程,也用于需要由调用者清除参数的例程;st

3、dcall: 和safecall主要用于调用Windows API 函数;其中safecall还用于双重接口。现在以一个实例来说明一个用delphi编写的程序如何调用包含form窗体dll的程序。Dll工程:library Project2; Important note about DLL memory management: ShareMem must be thefirst unit in your librarys USES clause AND your projects (selectProject-View Source) USES clause if your DLL expo

4、rts any procedures orfunctions that pass strings as parameters or function results. Thisapplies to all strings passed to and from your DLL-even those thatare nested in records and classes. ShareMem is the interface unit tothe BORLNDMM.DLL shared memory manager, which must be deployed alongwith your

5、DLL. To avoid using BORLNDMM.DLL, pass string informationusing PChar or ShortString parameters. usesSysUtils,Classes,Unit1 in Unit1.pas Form1;$R *.RESexportsExecute name Execute;过程来自于 Unit1beginend.unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCt

6、rls, Db, ADODB;typeTForm1 = class(TForm) ADOcon: TADOConnection; Memo1: TMemo;private Private declarations public Public declarations end;function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;varForm1: TForm1;i

7、mplementation$R *.DFMfunction Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;var oldhandle: THandle;beginOldHandle := Application.Handle; ;Application.handle := ApplicHandle.handle;Application.CreateForm(Tform1,

8、Form1);Form1.ADOcon.ConnectionString := adoobj.ConnectionString;Form1.ADOcon.Open;Form1.Memo1.Lines.Add(成功调用);form1.Memo1.Lines.Add(form1.ADOcon.ConnectionString);form1.ShowModal;form1.Free;form1 :=nil;Application.handle := OldHandle;end;end.调用dll程序的程序:program call_dll;usesForms,Ubtn in Ubtn.pas For

9、m1;$R *.RESbeginApplication.Initialize;Application.CreateForm(TForm1, Form1);Application.Run;end.unit Ubtn;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Db, ADODB;typeTForm1 = class(TForm) adocon: TADOConnection; Button1: TButton; procedure Button1Cl

10、ick(Sender: TObject);private Private declarations public Public declarations end;function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; external Project2.dll;varForm1: TForm1;implementation$R *.DFMprocedure TForm1.Butt

11、on1Click(Sender: TObject);beginexecute(application,application.Handle,adocon,Pchar(adocon.ConnectionString);end;end.PB的主程序调用DELPHI的DLL,DLL在函数执行完后回传一个字符串给PB主程序,DLL里用的是PCHAR类型。PB下该怎么接收?intRC,SectorID=15,i=1charReadStr64intli_data64charls_data64stringdata=Rc=M1QueryCard(15,refReadStr)dowhilei=64li_data

12、i=asc(ReadStri)ls_datai=get_hex(li_datai)i+loop/ReadStr=get_hex_str(ReadStr)messagebox(FOXHIS,ls_data)以上是PB的程序。M1QueryCard(15,refReadStr)这个是我DELPHI写的DLL里的函数。ReadStr是DLL以PCHAR类型回传的一个字符串现在这样不能用,读不到数据。哪位知道是什么问题么-把你的delphi的dll函数类型,及相关代码也贴一下,否则怎么看得出来呢?-DELPHI的DLL代码:varReadCardDataHex:string;/全局变量Function

13、M1QueryCard(SectorID:Shortint;varCardDatas:PChar):integer;stdcall;/查询卡var.HexData1,HexData2:string;begin.fori:=0to15dobeginHexData2:=HexData2+IntToHex(CardData2i,2);end;end;ReadCardDataHex:=HexData1+HexData2;CardDatas:=Pchar(ReadCardDataHex);result:=0;end;我DELPHI程序这样调用正常:FunctionM1QueryCard(SectorID:Shortint;varCardDatas:PChar):integer;stdcall;externalM1Dll;-pb调用delphi中dll,这种不同开发工具之间调试问题;可以这样做,用delphi写一个小小的测试程序,用于测试dll,确保dll功能正确后,再由PB调用测试;注意PB中的Externa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号