Перейти к содержанию
Fire Monkey от А до Я
  • 0

Приведение типа - as


x11

Вопрос

Есть 2 кода. Вернее, 2 строки одного и того же кода.

В первом случае ошибка segmentation failure (11).

Во втором случае ошибки нет.

 

telephonyManager := TJTelephonyManager.Wrap(ILocalObject(telephonyService).GetObjectID);

 

telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID);

 

Такое приведение типов, с использованием AS касается только Андроида? Или это зависит от компилятора? Или от платформы?

Теперь тек, как в пером случае, уже нельзя?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть:

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;

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...