Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216116
  • 博文数量: 64
  • 博客积分: 2010
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-25 19:03
文章分类

全部博文(64)

文章存档

2013年(1)

2012年(9)

2011年(25)

2010年(7)

2009年(16)

2008年(6)

分类: WINDOWS

2010-06-10 10:51:52

1.Delphi函数调用中参数的传递:
 (1)cdecl:
     通常是C/C++所使用的参数传递方式,它的传递方式是由右到左,而且当被调用的函数结束之后,将会由调用函数本身来清除堆栈上的参数数据.
  (2)stdcall:
     参数传递方式,也是由右到左,但是当被调用的函数结束之后,则是由被调用函数来清除堆栈上的参数数据,Win32API所有的输出函数都是采用此中参数传递方式
  (3)pascal:
     是Delphi1.0与win16API所使用的参数传递方式,它的传递方式是由左到右,而且由被调用函数来清除堆栈上的参数数据.
  (4)fastcall:
     是Delphi默认所使用的参数传递方式,此种方式在传递参数时把前三个参数放在CPU的EAX,EDX,ECX三个缓存器种,剩下的参数则会由左到右地被取出放到堆栈中,而当被调用的函数结束之       后,则是由被调用函数来清除堆栈上的参数数据.
   注:所以在引用C++动态库中的函数时,要注意参数的传递方式,一般使用stdcall.还要注意字符串类型,C++在传递字符串时,都是采用字符指针的类型(Char *),所以你在Delphi的程序中就必须使用PCHAR类型,而不是string类型.
2.Delphi各种变量结构:
 

3.Delphi 类的内存结构:

类的内存结构是固定的,编译完成后就无法改变。它主要存储了类的基本信息,派生对象内存大小,虚方法列表,动态方法列表,公开属性和方法列表(published),接口列表,TObject类的一些方法等等有关于构建对象所必须的信息。这些信息的存储位置在SYSTEM单元中有定义:
vmtSelfPtr           = -76;         指向虚方法表的指针
vmtIntfTable         = -72;          指向接口表的指针
vmtAutoTable         = -68;        指向自动化信息表的指针
vmtInitTable         = -64;          指向实例初始化表的指针
vmtTypeInfo          = -60;        指向类型信息表的指针,这里的数据对于RTTI来说非常重要,它指向一个PTypeInfo类型的指针,有兴趣可以看看TypInfo单元
vmtFieldTable        = -56;          指向域定义表的指针(我开始认为是Published Field,但实际查询时却为NIL)

vmtMethodTable       = -52;        指向方法定义表的指针(Published)

vmtDynamicTable      = -48;        指向动态方法表的指针

vmtClassName         = -44;       指向类名字符串的指针

vmtInstanceSize      = -40;          对象实例的大小

vmtParent            = -36;        指向父类的指针

vmtSafeCallException = -32 deprecated; 以下都是TOBJECT类的一些虚拟方法指针

vmtAfterConstruction = -28 deprecated;

vmtBeforeDestruction = -24 deprecated;

vmtDispatch          = -20 deprecated;

vmtDefaultHandler    = -16 deprecated;

vmtNewInstance       = -12 deprecated;

vmtFreeInstance      = -8 deprecated;

vmtDestroy           = -4 deprecated;

由上可见,类的过程和方法相关数据都在类的前面放置,经过测试,类定义的变量,按照书写的位置顺序排列,默认4字节对齐,只有Extended是个例外,它有可能前面会空出4字节

 

在dephi类中,eax 为this指针。

阅读(2392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~