作为参数传给外部函数时,Delphi(的自动化支持)自动把
在Linux下,不支持VT_decimal。
- 160 - VType字段的Delphi函数。在varString转换为varTypeMaskWindows下,当把varOleStr类型。varArrayvariant和
Program control
Program control(程序控制)
Program control: Overview(概述)
这一部分解释参数、和函数结果如何存储和传输。最后介绍exit过程。
Parameters and function results(参数和函数结果)
Parameters and function results: Overview(概述)
有几个因素决定参数、函数结果如何被处理,它们包括调用约定、参数语义以及传递值的类型和大小。 Parameter passing(参数传递)
参数是通过CPU寄存器或栈传递给过程或函数的,这取决于例程的调用约定。要了解调用约定的信息,请参考Calling conventions。
变量参数(var)总是通过引用传递(作为32位指针),它指向(变量参数的)实际存储位置。 值传递和常量参数(const)可通过值传递,也可能通过引用传递,这取决于参数的类型和大小:
z 一个有序类型的参数通过8位、16位、32位或64位值进行传递,它们的格式和相同类型的变量
一致。
z 一个实数参数总是被传递到栈中。一个Single类型的参数占用4字节;Double、Comp或Currency
类型占用8字节;Real48也占用8字节,它的值存储在较低的6个字节中;Extended类型占用12字节,它的值存储在较低的10个字节中。
z 一个短字符串类型的参数,作为一个指向它的32位指针传递。
z 一个长字符串或动态数组类型的参数,也作为32位指针,它指向分配的内存块。值nil作为一个
空(长)串传递。
z 一个指针、类、类引用或过程(指针)类型的参数作为32位指针传递。
z 一个方法指针作为两个32位指针被传递到栈中。实例(对象)指针在方法指针之前被压入栈,所
以方法指针占据较低的地址。
z 在register和pascal调用约定下,一个Variant类型参数被作为32位指针传递。
z 1、2或4字节的集合、记录和静态数组被当作8位、16位和32位值传递。较大的集合、记录和
静态数组被作为32位指针。一个例外是,当使用cdecl、stdcall或safecall调用约定时,一个记录类型总是直接传给栈,此时,记录的大小被圆整位双字(4字节的倍数)。
z 一个开放数组类型的参数作为2个32位值传递。第一个是指向数组的指针,第2个是数组的元素
个数减1(也就是数组的最大下标)。
当两个参数被传递到栈时,每个参数占用4字节的倍数。对8位或16位参数来说,即使它们只占用1个字节或1个字,它也作为双字传递。双字中未用的部分没有定义。
在pascal、cdecl、stdcall和safecall约定下,所有的参数被传递给栈。在pascal约定下,参数按它们声明的顺序(从左到右)被压入栈,所以,第一个参数在最高地址,最后一个参数在最低地址。在cdecl、stdcall和safecall约定下,参数以声明的相反顺序(从右到左)被压入栈,所以,第一个参数在最低位置,而最后一个在最高位置。
在register约定下,最多有3个参数可通过CPU寄存器传递,其余(若有的话)参数被传递到栈。此时,
- 161 -
Program control
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-120.html
真正重要的东西用眼睛是看不见的