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方法獲取,我們只要關注如何得到參數信息就可以了。