1. Pascal / Говнокод #9979

    +73

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 18 Апреля 2012

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

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

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

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

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