Школоло / Говнокод #9979 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
function ADHasFactory(const AIID: TGUID): Boolean;
var
  oIntf: IUnknown;
begin
  try
    ADCreateInterface(AIID, oIntf, False);
    Result := oIntf <> nil;
  except
    Pointer(oIntf) := nil;
    Result := False;
  end;
end;

AnyDAC. Проверка наличия фабрики для заданного интерфейса.

Запостил: LightBlack LightBlack, (Updated )

Комментарии (11) RSS

  • Смущает строка 9? Учитывая, что для интерфейсов выполняются автодеструкторы, это может иметь смысл. Хотя если nil, то в натуре нахрена...
    Ответить
    • Меня больше смущает строка 6 (создание объекта или получение синглтона) вместо поиска по списку зарегистрированных фабрик.
      Ответить
    • Если бы "обнуление" происходило напрямую, т.е. oIntf := nil и переменная указывает на мусор, то, с большой вероятностью, произойдёт AV.

      Такое обнуление: Pointer(oIntf) := nil безопасное. Можно так же и так NativeInt(oIntf) := 0 обнулить не боясь AV;
      Ответить
      • Что значит безопаснее? Не вызовет автодеструктор?
        Ответить
        • При присвоении nil интерфейсной переменной сначала вызывается метод _Release, а в нём декремент кол-ва ссылок и проверка на 0 кол-ва ссылок на объект ... Если ссылок нет, то вызывается деструктор. Поэтому, во избежании вызова _Release, обычно тип приводят к Pointer/Integer и обнуляют его =)
          Ответить
  • а вот и быдлодельфяшечка
    купи наши компаненты и станеш програмисстом!
    Ответить
  • 1. До вызова метода ADCreateInterface переменная oIntf может принимать любое значение;
    2. Если в методе ADCreateInterface не происходит никакой инициализации in/out аргументов, то при возникновении в ADCreateInterface исключительной ситуации мусор в переменной oIntf останется (если он там, конечно, был ... шанс 99%, что будет);
    3. Если произошло исключение в ADCreateInterface и при выходе из метода ADHasFactory переменная oIntf не nil, то произойдёт попытка освободить интерфейс и, разумеется, приключится AV;

    Поэтому, всё сделано правильно, хомячки;
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8