delphi调用dll:delphi的调用约定




Calling conventions(约定)


   在声明过程或你可以使用下面指示字的来指明约定:register、pascal、cdecl、stdcall以及safecall比如

function MyFunction(X, Y: Real): Real; cdecl;
...
      约定决定了参数被传递给例程顺序它们也影响从堆栈中删除参数、传递参数时寄存器使用以及和异常处理默认约定是register

• register 和pascal 从左到右传递参数也就是说最左边参数最早被计算并传递最右边参数最后被计算和传递;cdecl、stdcall 和safecall 从右到左传递参数;
• 除了cdecl 过程和在返回的前从堆栈中移除参数而使用cdecl返回时者从堆栈中移除参数;
• register 能使用多达3 个CPU 寄存器传递参数而其它则全部使用堆栈传递参数;
• safecall 实现了异常“防火墙”在Windows 下它实现了进程间COM 通知
下面表格对约定进行了整理总结:

--------------------------------------------------------------------------------------------------
-指示字-------------- 参数顺序--------- Clean-up ---------------使用寄存器传递参数?|
-register--------------- Left-to-right ---------Routine -----------------Yes---------------------||
-pascal ---------------  Left-to-right ---------Routine -----------------No----------------------|
-cdecl----------------- Right-to-left ---------Caller --------------------No---------------------|
-stdcall ----------------Right-to-left ----------Routine --------------------No------------------|
-safecall--------------- Right-to-left ----------Routine --------------------No------------------|
-------------------------------------------------------------------------------------------------
        默认register 是最有效它通常避免了要创建堆栈结构(stack frame)(访问公布属性思路方法必须使用register);当来自C/C编写共享库中cdecl 是有用;通常外部代码时推荐使用stdcall 和safecall在Windows 中系统API 使用stdcall 和safecall其它操作系统通常使用cdecl(注意stdcall 比cdecl 更有效)
        声明双重接口思路方法必须使用safecall;保留pascal 是为了向后兼容性要了解更多约定信息请参考Program control
        指示字near、far 和export 用在16 位Windows 编程中它们对32 位没有影响保留它们是为了向后兼容性


Tags:  delphi调用函数 delphi调用程序 delphi调用cdll delphi调用dll

延伸阅读

最新评论

发表评论