2012-08-23 78 views
4

我已經功能(Delphi編寫的7,32位):如何檢查傳遞的參數是否是類?

Function GetVMTAddr(var C): Integer; 
Begin 
    Result := Integer(C); 
    Try 
    PVmt(Result)^.SelfPtr := PVmt(C)^.SelfPtr; 
    Except 
    Result := 0; 
    End; 
End;

它返回VMT地址(我認爲這是VMT,我不知道),並檢查是否參數是一個對象(通過try...except ,這是imho差解決方案)。
我有兩個問題:
1)這是真的VMT地址還是我錯了?
2)有沒有更好的解決方案來檢查參數是否是一個對象?

+2

[此問題](http://stackoverflow.com/q/760513/62576)可能會有所幫助。 –

+0

@Ken White:謝謝,我發現了這個問題,但還有第二個問題,我無法找到答案。 –

+1

有趣的問題在「不要在家試用」類別。 –

回答

10

如果你傳給它的是類引用(a.k.a.元類),則參數C將保存VMT地址。

您在函數中檢查的條件是無用的。它檢查某個區域的內存是否可寫,這就是全部。如果您是檢查SelfPtr字段是否等於該值本身,那麼您會更接近。事情是這樣的:

if PVmt(C).SelfPtr = C then 
    Result := C; 

你問什麼是非常相似的,幾年前在這裏問了一個問題,如果有人想知道how to detect the type of a variable。正如我之前解釋的那樣,如果你已經到了你認爲你需要使用這些代碼的地步,那麼你已經陷入困境。回去改變你的設計,這樣你就可以知道你是否有類引用或對象引用,而不必猜測。

如果您確實需要猜測,那麼您可以嘗試使用JCL提供的功能,IsClassIsObject。他們做了與你的代碼嘗試使用相同的猜測,但他們做對了。

+3

+許多「如果你已經到了你認爲你需要使用這個代碼的地步,你已經遇到了麻煩」 –

+0

......並且它仍然在猜測。 ;-) –

相關問題