易截截图软件、单文件、免安装、纯绿色、仅160KB

Delphi 类与对象内存结构浅析(上)


参考资料
李战.《悟透delphi》,第1章“DELPHI的原子世界”
 “探索Delphi类与对象的内存结构”
基本知识
动态内存与静态内存
当程序运行时,系统首先将所有数据装载入内存,完成初始化,然后从入口地址开始执行代码。
程序装载后即存在于内存空间中的数据我们称之为静态内存,运行过程中分配的内存我们称之为动态内存。
Delphi的类是由编译期间决定的,编译完成后即固定在程序中,所以类是存在于静态内存中(类信息应该是位于数据段,类的方法实现应该是位于代码段)。对象是由运行期间创建的,所以对象属于动态内存。
 
对象
DELPHI中的对象是一个指针,这个指针指向该对象在内存中所占据的一块空间。我们可以试着用sizeof函数获取对象的大小,结果是4字节,这正是一个32位指针的大小。而对象的真正大小应该用MyObject.InstanceSize获得。
 
对象空间
我们将对象指针指向的内存空间称为对象空间。对象空间的头4个字节是指向该对象直属类的虚方法地址表(VMT – Vritual Method Table)。接下来的空间就是存储对象本身成员数据的空间,并按从该对象最原始祖先类的数据成员到该对象具体类的数据成员的总顺序,和每一级类中定义数据成员的排列顺序存储。
当一个对象产生时,系统会为该对象分配一块内存空间,然后将空间的头4个字节存储为指向类的VMT的指针,从而将该对象与对象的直属类联系起来。即使类并未定义任何虚方法,对象仍然会保存指向虚方法地址表的指针,只是VMT地址项的长度为零。
 
类空间
我们将类指针指向的内存空间称为类空间。类指针与VMT指针地址相同。在TObject中定义的虚方法地址(如Destroy、FreeInstance等等)存储在相对VMT指针负方向偏移的空间中。在VMT的负方向偏移有76个字节的数据信息,它们是对象类的基本数据结构。而VMT是存储我们自己为类定义的虚方法地址的地方,它只是类数据结的构扩展部分。VMT前的76个字节的数据结构是DELPHI内定的,与编译器相关的,并且在将来的DELPHI版本中有可能被改变。
对我们的应用程序来说,类的数据是静态的数据。当编译器编译完成我们的应用程序之后,这些数据信息已经确定并已初始化。我们编写的程序语句可访问类数据中的相关信息,获得诸如对象的尺寸、类名或运行时刻的属性资料等等信息,或者调用虚方法以及读取方法的名称与地址等等操作。
 
VMT
每一个类都有对应的一个虚方法地址表(VMT – Vritual


相关文档:

DELPHI 查找,增加,修改,删除

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button ......

Delphi 的 Dll 函数的 调用


一、Dll建立
(一)DLL项目的建立
library mydll;
 
uses
base in 'base.pas';
 
exports
Triple name 'Tr';
 
{$R *.res}
 
begin
end.
 
(二)函数单元
unit base;
 
interface
 
uses windows;
 
function Triple(N:integer):integer;stdcall;
  ......

在DELPHI中显示GIF动画

想没想过在DELPHI中显示GIF动画?Delphi的用户是非常幸运的,因为有免费控件可以使用。最著名的控件是Anders Melander编写的TGifImage,并提供完整的源程序。它原来的主页是www.melander.dk/delphi/gifimage/,不过有很长时间没有更新了。如果要在新版本的Delphi中使用,可以从http://finn.mobilixnet.dk/delphi/下载Finn T ......

Windows API 的数据类型与 Delphi 数据类型对照表

Windows API 的数据类型与 Delphi 数据类型对照表
作者:admin 来源:未知 日期:2010-1-28 13:10:56 人气:43 标签:API
导读:WindowsAPI的数据类型与Delphi数据类型对照表
Windows 数据类型 
 Delphi 数据类型 
描述
LPSTR
PAnsiChar
字符串指针
LPCSTR
PAnsiChar
字符串指针
DWORD
LongWo ......

DELPHI GetClassName 获取指定窗口的类名

//声明:
GetClassName(
hWnd: HWND; {指定窗口句柄}
lpClassName: PChar; {缓冲区}
nMaxCount: Integer {缓冲区大小}
): Integer; {返回类名大小; 失败返回 0}
//测试1: 新建一个工程, 主窗口的类名默认是 TForm1, 用程序获取一下看看
var
ps: array[0..254] of Char;
begin
GetCl ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号