Вы должны следить за тем, что было сказано о типе безопасности и приведениях с very first comment к вам. Я не буду повторять этого и сосредоточиться на практическом подходе к конкретной проблеме. Это также ограничивает обсуждение 32-битной целью (поскольку вы задаете вопрос SizeOf(Integer) = SizeOf(Pointer)
);
Прежде всего, поскольку объекты являются указателями (как вы узнали из других ответов), его свойства, наложенные платформой, могли бы отличить действительный указатель (действительный!) И целочисленное значение.Посмотрите, как Windows, сказать указатель символов и перечисленные значения друг от друга:
function Is_IntResource(lpszType: PChar): BOOL;
begin
Result := ULONG_PTR(lpszType) shr 16 = 0;
end;
Это использует тот факт, что нет данных пользовательского режима не могут быть выделены в этой малой области памяти на 32-битной платформе Windows, и, таким образом, , нет действительного значения указателя p < 65536
может существовать.
Далее вы можете использовать Delphi-специфический внутренний формат данных экземпляров объекта, чтобы проверить, если указатель действительно экземпляр объекта:
/// <summary>
/// Verifies that the argument points to valid object instance.
/// </summary>
/// <exception cref="EAccessViolation">
/// If segmentation fault occurs while attempting to read VMT and/or its
/// field from the specified memory address.
/// </exception>
/// <remarks>
/// Delphi only, incompatible with FPC.
/// </remarks>
/// <example>
/// <code lang="Delphi">
/// procedure TForm1.FormCreate(Sender: TObject);
/// begin
/// ShowMessage(BoolToStr(IsInstance(Self), True));
/// end;
/// </code>
/// </example>
function IsInstance(Data: Pointer): Boolean;
var
VMT: Pointer;
begin
VMT := PPointer(Data)^;
Result := PPointer(PByte(VMT) + vmtSelfPtr)^ = VMT;
end;
Эта функция анализирует V irtual M еню T способный для подписи Delphi RTL и (заданные операции чтения памяти были успешными и проверка сигнатуры прошла) идентифицирует произвольный указатель как экземпляр TObject
(или потомок).
nil
/0
: Вы должны взять даже более специальные меры предосторожности, о 0
значений указателя, так как это довольно значимое, как Pointer
, а также часто, как Integer
.
[TValue] (http://docwiki.embarcadero.com/Libraries/en/System.Rtti.TValue) может содержать как целые типы, так и экземпляры классов. Нет никакого безопасного способа сказать, что ваше целое указывает на экземпляр класса. –
Самый простой способ сделать это: ** не делайте этого **, потому что это глупо. Не смешивайте целые числа и объекты, и у вас нет этой проблемы. Серьезно, когда вы начинаете задавать такие вопросы, это чрезвычайно убедительное доказательство того, что вы сделали что-то совершенно неправильное, и лучший способ выйти из этой ситуации - прекратить делать то, что вы делаете неправильно, что вы должен был задать этот вопрос. –