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

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

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


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

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



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

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

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

Если вы отдаёте куда-то налево объекты с неизвестным временем жизни, то интерфейсы вам в
руки: счётчик ссылок рулит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.04.2018, 16:47
    #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
21.04.2018, 16:53
    #39634161
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безопастная проверка на объект или класс
Aniskin,

Да.. Я пробовал эту реализации... Они падали к сожелению.... VMT единственное решение
...
Рейтинг: 0 / 0
21.04.2018, 16:58
    #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
21.04.2018, 18:54
    #39634189
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безопастная проверка на объект или класс
ГирлионайльдоКакие есть реализации проверки объекта на класс и объект ? Безопастно, без приведения каждого к разной реализации TClass и TObject что бы не падало, когда туда что - то не того попадёт(...?)

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

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

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

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

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



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

Можно пользователям отдавать не объекты, а хендлы к ним. Тогда можно формировать ошибки "объект не того типа", "объект не существует" и пр., но это потребует некой переделки API.
...
Рейтинг: 0 / 0
22.04.2018, 01:32
    #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
22.04.2018, 03:02
    #39634283
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Безопастная проверка на объект или класс
Если я буду писать документацию, то только по использованию фишек. Ибо написать документацию по VCL и прочему, будет невозможно

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

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


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


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