delphi编写调用有窗体有返回值的dll的实现方1_第1页
delphi编写调用有窗体有返回值的dll的实现方1_第2页
delphi编写调用有窗体有返回值的dll的实现方1_第3页
delphi编写调用有窗体有返回值的dll的实现方1_第4页
delphi编写调用有窗体有返回值的dll的实现方1_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 library's USES clause AND your project's (selectProject-View Source) USES clause if you

4、r DLL exports 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 along

5、with your 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, C

6、ontrols, Forms, Dialogs,StdCtrls, 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; stdca

7、ll; export;varForm1: TForm1;implementation$R *.DFMfunction Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;var oldhandle: THandle;begine; ;Application.handle := ApplicHandle.handle;Application.CreateForm(Tform1, F

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

9、pas' Form1;$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; procedu

10、re Button1Click(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 *.DFM

11、procedure TForm1.Button1Click(Sender: TObject);beginexecute(application,application.Handle,adocon,Pchar(adocon.ConnectionString);end;end.PB的主程序调用DELPHI的DLL,DLL在函数执行完后回传一个字符串给PB主程序,DLL里用的是PCHAR类型。PB下该怎么接收?    int RC,SectorID=15,i=1 char ReadStr64 int li_da

12、ta64 char ls_data64 string data='' Rc = M1QueryCard(15,ref ReadStr) do while i<=64 li_datai=asc(ReadStri) ls_datai=get_hex(li_datai) i+ loop /ReadStr=get_hex_str(ReadStr) messagebox('FOXHIS',ls_da

13、ta)   以上是PB的程序。M1QueryCard(15,ref ReadStr)这个是我DELPHI写的DLL里的函数。ReadStr是DLL以PCHAR类型回传的一个字符串  现在这样不能用,读不到数据。哪位知道是什么问题么 -把你的delphi的dll函数类型,及相关代码也贴一下,否则怎么看得出来呢? -DELPHI的DLL代码: var   ReadCardDataHex: string;/全局变量 Function M1QueryCa

14、rd(SectorID:Shortint;var CardDatas:PChar):integer; stdcall;  /查询卡 var . HexData1,HexData2: string; begin     .     for i:=0 to 15 do     begin   

15、    HexData2:= HexData2+IntToHex(CardData2i,2);     end;   end;   ReadCardDataHex := HexData1+HexData2;   CardDatas:=Pchar(ReadCardDataHex);   result:=0; end; 我DELPHI程序这样

16、调用正常: Function M1QueryCard(SectorID:Shortint;var CardDatas:PChar):integer;stdcall;external M1Dll; -pb调用delphi中dll,这种不同开发工具之间调试问题; 可以这样做,用delphi写一个小小的测试程序,用于测试dll,确保dll功能正确后,再由PB调用测试; 注意PB中的External Functions中,定义的dll输出类型要正确,一般来说,应该没有什么太大的问题的。 -哦,这么快就贴出来了,&

17、#160;我觉得问题在这里: CardDatas:=Pchar(ReadCardDataHex);/ReadCardDataHex是一个String类,这仅仅是指针指向而已, 改成这样试试: StrCopy(CardDatas,ReadCardDataHex); -StrCopy(CardDatas,pchar(ReadCardDataHex); 要这样才能编译。这样也不行,程序死掉了。DLL里的代码还没执行完就提示XX错误,问要不要发送了。 -你的M1QueryCard在PB中是怎么声明的呀? -Function 

18、;int M1QueryCard(int SectorID,ref string CardDatas) library  'm1.dll' 以前是这样定义的,不能用。不知道对方现在有没改动过 -我不记得PB中的string是什么特别的类型了,改为 在delphi中Pchar,就是cha指针,而你上面的PB代码:char ReadStr64; 定义改为这样试试: Function int M1QueryCard(int S

19、ectorID,ref char* CardDatas) library 'm1.dll' 呵呵,我也不确定是否行,有几年没有用PB了,忘记了 -另外,你的delphi测试代码是怎么调用的呢? 如果dll的第二个参数不用var,会怎么样,这样试试: Function M1QueryCard(SectorID:Shortint;CardDatas:PChar):integer; stdcall; /查询卡 . -不用VAR会得不到回传的值。 

20、DELPHI调用时声明为: Function M1QueryCard(SectorID:Shortint;var CardDatas:PChar):integer;stdcall;external 'm1.dll' 唉。郁闷。现在搞不定。用简单的方法用着。我把读出的数据保存为文本文件,对方打开文件读进来处理。 -这样定义: Function M1QueryCard(SectorID:Shortint;CardDatas:PChar):integer; stdcall; delph

21、i中,pchar类型,不用var也是可以返回数据的, var   cc:Array 0.256 of char   ii:shortint; begin      M1QueryCard(i,cc);      showmessage(cc);/这样是可以返回数据的吧  -这样试试: delphi的dll中:  Fun

22、ction M1QueryCard(SectorID:Shortint;CardDatas:PChar):integer; stdcall; PB声明: Function int M1QueryCard(int SectorID,ref string CardDatas) library 'm1.dll' 如果这样都不行,呵呵,也想不什么问题了,我的机子上的PB早就删除了 -噢。郁闷。这样没试过。我的DELPHI程序调用是没问题的。现在就是PB有问题

23、。 下午跟对方说好了。我保存成文件,他来读。现在靠这样传数据。汗。真郁闷 -PB程序可以这样写: int RC,SectorID=15,i=1 string ReadStr int li_data64 char ls_data64 string data='' readstr = spaces(64) Rc = M1QueryCard(15,ReadStr) PB声明: funct

24、ion M1QueryCard(integer len,ref string ReadStr) . Delphi程序这样写试试: Function M1QueryCard(SectorID:integer;CardDatas:PChar):integer; stdcall; -shortintPB不支持。 delphi adoconnection对象传递到dll中的窗体中的adoquery2010-01-10 20:35dds10086 | 分类:其他编程语言 | 浏览1615次showForm(adoC:TAdoConnection); var begin try frmDLL :=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论