程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi2009初體驗 - 語言篇 - 反射單元ObjAuto的加強(2)

Delphi2009初體驗 - 語言篇 - 反射單元ObjAuto的加強(2)

編輯:Delphi

2、Delphi的原子世界

類中的函數及函數的參數信息在VMT中也有存放,我們只要知道這些信息是如何存放的,所有事情都變得簡單了。下面我畫出在VMT中表示函數信息的那一塊結構:

從上圖我們可以看到,在VMT中每個函數結構都包含了一個TMethodInfoHeader頭,一個TReturnInfo返回值結構,若干個TParamInfo參數結構。參數的個數我們是沒有辦法直接獲取的,但是我們可以通過指針往下遍歷,直到指針的值大於TMethodInfoHeader.Len為止,累加參數的個數。

*1:為什麼是SizeOf(TMethodInfoHeader) – 255 + Length(mi1.Name)字節呢?

首先我們來看TMethodInfoHeader結構體:

1   TMethodInfoHeader = record
2 Len: Word;
3 Addr: Pointer;
4 Name: ShortString;
5 end;

我們來分析一下,結構體TMethodInfoHeader所占的字節(SizeOf(TMethodInfoHeader))為SizeOf(Word) + SizeOf(Pointer) + SizeOf(ShortString) = 2 + 4 + 256 = 262。如果Name字段只占了3個字節,SizeOf(TMethodInfoHeader)仍然是262,不受Name字段長度的影響,但是下一個數據是緊挨著Name的3個字節存的,中間不會留空格。

所以,我們必須使用SizeOf(TMethodInfoHeader) – 256 + Length(Name)。另外,由於字符串第0個字節保存的是字符串的長度,我們-256把保存字符串長度的那一位也減掉了,所以得+1:

SizeOf(TMethodInfoHeader) – 256 + Length(Name) + 1 = SizeOf(TMethodInfoHeader) – 255 + Length(Name)

*2:mi1: TMethodInfoHeader的信息我們可以通過ObjAuto.GetMethodInfo方法獲取,我們只要關注如何得到參數信息就可以了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved