Полюбуйтесь на код обеспечивающий проверку идентификатора интерфейса на соответствие "magic GUID" ({CEDF24DE-80A4-447D-8C75-EB871DC121FD}), для безопасного кастинга (TMyObject(TMyIntf)) к объектому типу:
if (Int64(ObjCastGUID.D1) = Int64(IID.D1)) and
(Int64(ObjCastGUID.D4) = Int64(IID.D4)) then
Pointer(Obj) := Self;
И это в системном юните... #78808
3 комментария:
Ужасный наверное по своей компетентности вопрос: а что тут не так? В семерке вроде подобным образом же сделана проверка.
В сравнение не попадают два поля записи, а именно D2 и D3 (Word). Приведение D1 (Longword) к Int64 работает не так, как думал автор. Корректный код должен быть таким PInt64(@ObjCastGUID.D1)^ = PInt64(@IID.D1)^. Хотя можно было и дополнительные переменные с абсолютной адресацией ввести, но это на любителя.
Блин. Вы что забыли, что это пишут долбанутые эмерикоские программаторы, а не наши продвинутые хакты. Лучшие в мире программеры с постсоветов и Индии, давно пора знать.
Отправить комментарий