x11 Опубликовано 29 января, 2018 Поделиться Опубликовано 29 января, 2018 Есть 2 кода. Вернее, 2 строки одного и того же кода. В первом случае ошибка segmentation failure (11). Во втором случае ошибки нет. telephonyManager := TJTelephonyManager.Wrap(ILocalObject(telephonyService).GetObjectID); telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID); Такое приведение типов, с использованием AS касается только Андроида? Или это зависит от компилятора? Или от платформы? Теперь тек, как в пером случае, уже нельзя? Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 31 января, 2018 Администраторы Поделиться Опубликовано 31 января, 2018 Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть: 1. Для вызова Interface1(Instance), вызывает системный метод _IntfCopy, который по сути не проверяет типы, а просто увеличивает счетчик типов. Такое приведение типов не проверяет типы, а просто копирует указатель а реализацию. procedure _IntfCopy(var Dest: IInterface; const Source: IInterface); {$IFDEF PUREPASCAL} var P: Pointer; begin P := Pointer(Dest); if Source <> nil then Source._AddRef; Pointer(Dest) := Pointer(Source); if P <> nil then IInterface(P)._Release; end; {$ELSE} 2. При использовании оператора as будет вызван _IntfCast, который выполняет честное приведение типов через QueryInterface. Поэтому в этом случае вы получите на выходе честный указатель на таблицу интерфейса, если интерфейс поддерживается объектом. procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID); {$IF defined(PUREPASCAL) or defined(PIC)} // PIC: EBX must be correct before calling QueryInterface var Temp: Pointer; begin if Source = nil then Dest := nil else begin Temp := nil; if Source.QueryInterface(IID, IInterface(Temp)) <> 0 then ErrorAt(byte(reIntfCastError), ReturnAddress) else begin if Assigned(Dest) then Dest._Release; Pointer(Dest) := Temp; end; end; end; Andrey Efimov, x11, Равиль Зарипов (ZuBy) и 2 других 4 1 Цитата Ссылка на комментарий
Вопрос
x11
Есть 2 кода. Вернее, 2 строки одного и того же кода.
В первом случае ошибка segmentation failure (11).
Во втором случае ошибки нет.
telephonyManager := TJTelephonyManager.Wrap(ILocalObject(telephonyService).GetObjectID);
telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID);
Такое приведение типов, с использованием AS касается только Андроида? Или это зависит от компилятора? Или от платформы?
Теперь тек, как в пером случае, уже нельзя?
Ссылка на комментарий
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.