Первый метод должен быть правильным и должен соответствовать обработке объектов в COM, вероятно, найденное вами определение предполагает, что потребитель знает правильный путь.
Другие упомянутые предметы требуют этого. Копирование VARIANT или SAFEARRAY содержит неявный AddRef (), когда они содержат объекты. VARIANT не требует его, когда присутствует VT_BYREF.
VariantCopy @ MSDN
SafeArrayCopy @ MSDN
Это поведение не присуще SAFEARRAY или VARIANT, поскольку оно является частью правил обработки параметров в COM. Однако ничто не мешает кому-то пытаться обойти правила.
Для входных параметров вызывающий не отвечает перед AddRef (), если он не намеревается сохранить указатель интерфейса для дальнейшего использования. Однако другие случаи использования параметров требуют этого.
Например, интерфейсы, помещенные в VARIANT или другие контейнеры, должны иметь хотя бы один вызов AddRef (), в противном случае это может создать проблемы при использовании VARIANT в качестве выходных параметров из методов COM, поскольку передача данных / ссылок является односторонней. Срок действия исходного объекта может истечь к тому времени, когда вызов прибудет к месту назначения. Точно так же маршалинг интерфейса в Stream также требует AddRef ().
Аналогично, для вызова по ссылке требуется, по крайней мере, один вызов AddRef. Если это не так, то любой подходящий длительный вызов (скажем, через DCOM) может не прийти к месту назначения с гарантией того, что указанный объект все еще жив. Однако здесь часто пропускаются дополнительные вызовы AddRef () / Release (), поскольку объект уже должен быть на уровне 1+ из-за создания в или перед областью вызова.
Если возможно изменить компонент, и ваши вызовы не обрабатываются, то вместо этого может быть желательно использовать GIT. Это позволяет вам вместо этого передавать токен, и будет проще маршалировать интерфейс через COM-квартиры. Время жизни задействованных объектов становится обязанностью вызывающей стороны в течение всего времени вызова, и вы сможете отследить случаи, когда объект не может быть маршалирован.
Создание таблицы глобального интерфейса @ MSDN
Также интересна сноска для BSTR.
Если реализация функции, которая принимает эталонный параметр BSTR, назначает этому параметру новый BSTR, она должна освободить ранее указанный BSTR.
Функции управления строками (COM)