Delphi 3.0中的函数调用模式

玖零后潮流使馆

玖零后潮流使馆

2016-01-29 14:08

Delphi 3.0中的函数调用模式,Delphi 3.0中的函数调用模式
 
在用Delphi 3.0开发软件时,出现了硬件驱动程序(DLL)中的函数和过程不能正常调用的问题,该硬件由英国Schlumberger公司生产,驱动程序用汇编语言编写的。其《编程指南》给出的Microsoft C的示范程序均能正常运行。但运行此软件时现出的错误提示为:
  Access violation at address ×××××××× in module……
  经仔细分析,才发现问题出现在函数调用模式上。
  Delphi 3.0支持五种调用模式:register、cdecl、pascal、stdcall和safecall。根据调用模式的不同,参数可以通过CPU的寄存器或堆栈传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆栈来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和safecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆栈中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆栈中的参数。
  如何选择调用模式,有以下三条规则:
  1.Delphi 3.0使用register模式作为缺省调用模式以提高运行效率。
  2.如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。
3.如果要实现双界面函数和过程,应使用safecall模式。
  所以解决我们的问题只要选用stdcall模式即可,Schlumberger公司的《编程指南》上在Microsoft C环境下的DLL函数说明(仅举两例)为:
  void(FAR PASCAL *Imp_ Connect)(unsigned short far*,short far*);
  void(FAR PASCAL *Imp_ Init)(short far*,short far*);
  相应的在Delphi 3.0下DLL函数引入说明为:
  procedure Imp_ Connect(var CardAddress:word;var CardHandle:smallint);stdcall;
  procedure Imp_ Init(var Poll_Tab:smallint;var ErrorFlag:smallint;var CardHandle:smallint);stdcall;
  这样修改以后,程序即可正常运行(原来我们没有说明调用模式,即使用缺省的register模式),由此我们也可得出一个经验:对一些高版本的新软件,使用时要注意改进和扩充,并经常看看帮助文件,定会大有裨益。 
展开更多 50%)
分享

猜你喜欢

Delphi 3.0中的函数调用模式

Delphi
Delphi 3.0中的函数调用模式

Delphi3.0中的函数调用模式

Delphi
Delphi3.0中的函数调用模式

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Delphi中API编程--在Delphi中调用API函数

Delphi
Delphi中API编程--在Delphi中调用API函数

DELPHI中动态调用dll

编程语言 网络编程
DELPHI中动态调用dll

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

delphi中的split函数

编程语言 网络编程
delphi中的split函数

delphi的调用约定

编程语言 网络编程
delphi的调用约定

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《勇气默示录2》困难打法心得与阵容分析攻略

《勇气默示录2》困难打法心得与阵容分析攻略

Delphi开发WEB应用程序打印组件

Delphi开发WEB应用程序打印组件
下拉加载更多内容 ↓