版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年LED控制与驱动产品项目发展计划
- 2024年医用射线防护用品装置项目建议书
- 2024年超低频测振仪项目发展计划
- 2024年耐磨球段合作协议书
- 商城合同范本
- 2024年戊二酮苯项目提案报告范文
- 2024年私人轿车项目申请报告模范
- 2024年物联网市场项目提案报告范文
- 2024年维修轿车项目申请报告
- 2024年玻纤网项目合作计划书
- 国际反洗钱师cams考试真题中文版题库汇总(含答案)
- 汽车空调系统检修(第2版)PPT完整全套教学课件
- 外科学-绪论-课件
- 严重心律失常的急救与护理
- 护士护理进修汇报课件
- 军队文职人员招聘《采购员》考前点题卷一
- 初中历史课程标准测试题
- 【教学】光的干涉 第2课时 1
- 第三季度学校意识形态工作分析研判报告
- 管网工程旁站监理方案
- 第2章 眼科学基础(第九版眼科学)
评论
0/150
提交评论