2012-08-23 52 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

......并且它仍然在猜测。 ;-) –

相关问题