вторник, октября 20, 2009

Delphi 2010. System.TObject.GetInterface

Полюбуйтесь на код обеспечивающий проверку идентификатора интерфейса на соответствие "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 комментария:

Semen комментирует...

Ужасный наверное по своей компетентности вопрос: а что тут не так? В семерке вроде подобным образом же сделана проверка.

Kazantsev Alexey комментирует...

В сравнение не попадают два поля записи, а именно D2 и D3 (Word). Приведение D1 (Longword) к Int64 работает не так, как думал автор. Корректный код должен быть таким PInt64(@ObjCastGUID.D1)^ = PInt64(@IID.D1)^. Хотя можно было и дополнительные переменные с абсолютной адресацией ввести, но это на любителя.

basilcat комментирует...

Блин. Вы что забыли, что это пишут долбанутые эмерикоские программаторы, а не наши продвинутые хакты. Лучшие в мире программеры с постсоветов и Индии, давно пора знать.