Сущность технологии СОМ. Библиотека программиста | страница 60



}

ICat cat;

try

{

cat = (ICat)obj;

// VM calls QueryInterface

// VM вызывает QueryInterface

cat.IgnoreMaster();

}

catch (Throwable ex)

{

// ignore method or QI failures

// игнорируется сбой метода или QI

}

}


Visual Basic не требует от клиентов приведения типов. Вместо этого, когда указатель интерфейса присваивается переменной неподходящего типа, виртуальная машина (VM) Visual Basic молча вызывает QueryInterface от имени клиента:


Sub TryToSnoreAndIgnore(obj as Object)

On Error Resume Next

' ignore errors

' игнорируем ошибки

Dim pug as IPug

Set pug = obj

' VM calls QueryInterface

' VM вызывает QueryInterface

If Not (pug is Nothing)

Then pug.Snore

End

if Dim cat as ICat

Set cat = obj

' VM calls QueryInterface

' VM вызывает QueryInterface

If Not (cat is Nothing)

Then cat.IgnoreMaster

End if End Sub


Обе виртуальные машины, как Java, так и Visual Basic, выбросят при сбое QueryInterface исключения. В обеих средах виртуальная машина автоматически преобразует языковую концепцию живучести переменной в явные вызовы AddRef и Release , избавляя клиента и от этой подробности.

Одна методика, потенциально способная упростить использование в СОМ интерфейсных указателей из C++, состоит в том, чтобы скрыть их в классе интеллектуальных указателей. Это устраняет необходимость необработанных (raw ) вызовов методов IUnknown. В идеале интеллектуальный указатель СОМ будет:


Корректно обрабатывать каждый вызов Add/Release во время присваивания.

Автоматически уничтожать интерфейс в деструкторе, что снижает возможность утечки ресурса и повышает безопасность (надежность) исключений.

Использует систему типов C++ для упрощения вызовов QueryInterface.

Прозрачным образом (незаметно для пользователя или программы) замещает необработанные интерфейсные указатели в существующем коде без компрометации правильности программы.


Последний пункт представляет собой чрезвычайно серьезную проблему. Интернет забит интеллектуальными СОМ-указателями, которые проделывают прозрачную замену обычных указателей, но при этом вводят столько же скрытых ошибок, сколько претендуют устранить. Visual C++ 5.0, например, фактически действует с тремя такими указателями (один на MSC, другой на ATL, а третий для поддержки Direct-to-COM), которые очень просто использовать как правильно, так и неправильно. В сентябрьском 1995 года и в февральском 1996 года выпусках "C++ Report " опубликованы две статьи, где на примерах показаны различные подводные камни при использовании интеллектуальных указателей