powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Безопастная проверка на объект или класс
18 сообщений из 18, страница 1 из 1
Безопастная проверка на объект или класс
    #39634109
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие есть реализации проверки объекта на класс и объект ? Безопастно, без приведения каждого к разной реализации TClass и TObject что бы не падало, когда туда что - то не того попадёт(...?)

Я пока полазил по исходникам и есть подозрения, что это можно как то сделать черех vmt Но не уверен пока.
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634111
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть мнение, что хороший программист должен точно знать что делает его программа, тогда
класс каждого объекта будет заранее известен и проверять его не придётся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634112
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Твоя правда. Ну а теперь моя: Как обучить других будущих пользователей, что цифорки от цвета или (Мёртвого уже компонента) Нельзя пихать в принимающий живой класс или объект? А проверка на сооствествие класса не сработает, через InheritsFrom потому что у нас вывалится ошибка


И что теперь? Нам совсем не делать проверки внашей программе, раз хороший программист знает что он делает, но не знает что с его программой будут делать на .
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634116
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я был прав насчёт VMT как оказывается, нашёл описание такой структуры
https://github.com/tsvtitan/stbasis/blob/cd9889f3c7a1e116fb42b219b9023c4f40e4aca6/Source/DesignTsv/RARTTI.pas#L71

Объявил длян её
Код: pascal
1.
2.
type
  PVMT = ^TVMT;



И объвил переменную PVMT начав сувать в неё циферки, ошибки перестали вываливатся. И есть адеватная возможность понять что это

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

Но всё же это лучше чем сидеть с ошибкой к обращению от цвета
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634128
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоУвы - мёртвый класс не проверяет, так что если пользователь сохранил куда то дубликатик
живой, клонировав объект. Я не смогу удалить в нём уже будучи мёртвий адресс созданного
компонента, и вывалится ошибка.

Если вы отдаёте куда-то налево объекты с неизвестным временем жизни, то интерфейсы вам в
руки: счётчик ссылок рулит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634160
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ГирлионайльдоКакие есть реализации проверки объекта на класс и объект ?

В JclSysUtils есть такое (работу не проверял):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function IsClass(Address: Pointer): Boolean; assembler;
asm
        CMP     Address, Address.vmtSelfPtr
        JNZ     @False
        MOV     Result, True
        JMP     @Exit
@False:
        MOV     Result, False
@Exit:
end;

function IsObject(Address: Pointer): Boolean; assembler;
asm
// or IsClass(Pointer(Address^));
        MOV     EAX, [Address]
        CMP     EAX, EAX.vmtSelfPtr
        JNZ     @False
        MOV     Result, True
        JMP     @Exit
@False:
        MOV     Result, False
@Exit:
end;
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634161
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin,

Да.. Я пробовал эту реализации... Они падали к сожелению.... VMT единственное решение
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634164
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот такие реализации работают на ура

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function isVMT(x: NativeInt): Boolean; overload; inline;
var
  r: PTVMT;
begin
  r := GetVMT(x);
  result := (r <> nil) and (r.SelfPtr <> nil);
end;

function isVMT(x: pointer): Boolean; overload; inline;
var
  r: PTVMT;
begin
  r := GetVMT(x);
  result := (r <> nil) and (r.SelfPtr <> nil);
end;
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634189
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоКакие есть реализации проверки объекта на класс и объект ? Безопастно, без приведения каждого к разной реализации TClass и TObject что бы не падало, когда туда что - то не того попадёт(...?)

Я пока полазил по исходникам и есть подозрения, что это можно как то сделать черех vmt Но не уверен пока.

Пользователи это другие разработчики использующие ваш код?
Если они туда будут сувать не то, что в документации, то метлу им в руки и улицы мести...
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634197
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Но всё же надо вывести им сообщение о том - что вы неправильно даёте то, что мы принимаем.

А то, придут в магазин и перед ними дверь сразу закроют. Потому что у них доллары, а у насс ССР с рублями. И ничего не сказали
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634220
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

Код: pascal
1.
2.
3.
4.
function IsClass(Address: Pointer): Boolean;
begin
  Result := (Address = PPointer(NativeInt(Address) + vmtSelfPtr)^);
end;



Но это не надёжный способ
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634267
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

Можно пользователям отдавать не объекты, а хендлы к ним. Тогда можно формировать ошибки "объект не того типа", "объект не существует" и пр., но это потребует некой переделки API.
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634277
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоX-Cite,

Но всё же надо вывести им сообщение о том - что вы неправильно даёте то, что мы принимаем.


Код: pascal
1.
2.
3.
4.
var
  a: DWORD;
begin
  Winapi.Windows.GetUserName(Pointer(545), a);


Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x771723e4: write of address 0x00000221'.

Вполне себе адекватная ошибка и реакция на "руки из жопы"....

ГирлионайльдоА то, придут в магазин и перед ними дверь сразу закроют. Потому что у них доллары, а у насс ССР с рублями. И ничего не сказали

Вы отдаете что-то без документации?? Школьники будут пользоваться или адекватные разработчики?
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634283
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я буду писать документацию, то только по использованию фишек. Ибо написать документацию по VCL и прочему, будет невозможно

...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634284
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064Гирлионайльдо,

Можно пользователям отдавать не объекты, а хендлы к ним. Тогда можно формировать ошибки "объект не того типа", "объект не существует" и пр., но это потребует некой переделки API.


Да вот как раз когда я додумался, было уже поздно. Есть как минимум 4 метода, где нужно вносить правки, а ещё в создание процедур и функций в PHP тоже завязаны на этом, придётся переписывать. Так что закину на чёрный ящик
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39634975
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдовот такие реализации работают на уранапример в мадыксепте IsValidObjectEx весит около 150 строк и предлагает 5 параметров
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39635065
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудеса ... Если есть свой прирученный менеджер памяти, то тожно у него спросить, что находится по этому адресу. FastMM с FullDebugMode еще может сказать, иначе - нет. Ты бы смог сказать, кто сидел в кинотеатре, по остаточной температуре сиденья ?
...
Рейтинг: 0 / 0
Безопастная проверка на объект или класс
    #39635405
Фотография AndyMandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо, RTTI механизм можно рассмотреть
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Безопастная проверка на объект или класс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]