Как проверить, является ли переданный аргумент классом?

У меня есть функция (написано в Delphi 7, 32-разрядная версия):

Функция GetVMTAddr(var C): Integer;
Начать
  Результат:= целое число (C);
  Пытаться
    PVmt(Результат)^.SelfPtr:= PVmt(C)^.SelfPtr;
  Кроме
    Результат:= 0;
  Конец;
Конец;

Который возвращает адрес VMT (я думаю, что это VMT, я не уверен) и проверяет, является ли параметр объектом (try...except, который является imho плохое решение).
У меня есть два вопроса:
1) Это действительно адрес VMT или я ошибаюсь?
2) Есть ли лучшее решение, чтобы проверить, что параметр является объектом?

1 ответ

Решение

Аргумент C будет содержать адрес VMT, если вы передаете ему ссылку на класс (он же метакласс).

Условие, которое вы проверяете в функции, бесполезно. Он проверяет, доступна ли для записи определенная область памяти, и все. Если вы проверяли, является ли SelfPtr поле было равно самому значению, тогда вы были бы ближе. Что-то вроде этого:

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

То, что вы спрашиваете, очень похоже на вопрос, заданный здесь несколько лет назад, когда кто-то хотел узнать, как определить тип переменной. Как я объяснил тогда, если вы дошли до того, что думаете, что вам нужно использовать этот код, у вас уже есть проблемы. Вернитесь назад и измените свой дизайн, чтобы вы могли знать, есть ли у вас ссылка на класс или ссылка на объект, вместо того, чтобы угадывать.

Если вам действительно нужно угадать, то вы можете попробовать использовать функции, предоставляемые JCL, IsClass а также IsObject, Они делают то же самое, догадываясь, что ваш код пытается использовать, но они делают это правильно.

Другие вопросы по тегам