欢迎来到天天文库
浏览记录
ID:57687434
大小:22.00 KB
页数:2页
时间:2020-09-01
《Delphi中的函数调用模式.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Delphi中的函数调用模式在用Delphi30开发软件时,出现了硬件驱动程序(DLL)中的函数和过程不能正常调用的问题,该硬件由英国Schlumberger公司生产,驱动程序用汇编语言编写的。其《编程指南》给出的MicrosoftC的示范程序均能正常运行。但运行此软件时现出的错误提示为:AccessviolationataddressXXXXXXXXinmodule'…·经仔细分析,才发现问题出现在函数调用模式上Delphi30支持五种调用模式:register、cdecLpascal、stdcall和safecall0根据调用模式的不同,
2、参数可以通过CPU的寄存器或堆校传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆校来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和Jsafecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆校中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆校中的参数。如何选择调用模式,有以下三条规则:1Delphi30使用register模式作为缺
3、省调用模式以提高运行效率。2如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。3如果要实现双界面函数和过程,应使用safecall模式。所以解决我们的问题只要选用stdcall模式即可Schlumberger公司的《编程指南》上在MicrosoftC环境下的DLL函数说明(仅举两例)为:void(FARPASCAL士ImpConnect)(unsignedshortfar士,shortfar士);void(FARPASCAL士ImpInit)(shortfar士,shortfar士);相应的在Delphi30下DLL
4、函数引入说明为:procedureImpConnect(varCardAddress:word;varCardHandle:smallint);stdcall;procedureImpInit(varPollTab:smallint;varErrorFlag:smallint;varCardHandle:smallint);stdcall;这样修改以后,程序即可正常运行(原来我们没有说明调用模式,即使用缺省的register模式),由此我们也可得出个经验:对些高版本的新软件,使用时要注意改进和扩充,并经常看看帮助文件,定会大有禅益。(浙江姜晓
5、东)
此文档下载收益归作者所有