Содержит ли CoCreateInstance автоматически AddRef для интерфейса, который я создаю, или я должен его вручную называть вручную?
В COM: следует ли мнезывать AddRef после CoCreateInstance?
Ответ 1
Контракт с COM - это когда вы передаете объект из такой функции, как CoCreateInstance(), QueryInterface(), которая в конечном итоге вызывает CoCreateInstance() и т.д., вызываемый всегда вызывает AddRef() до Возврат, и вызывающий (вы) всегда Release(), когда вы закончите.
Вы можете использовать CComPtr < > , чтобы сделать это проще, и он просто делает правильные вещи.
Теперь, если вам нужно передать этот указатель другому объекту, который ожидает его использования за время жизни вашего объекта, вам необходимо вызвать AddRef(), прежде чем выдать его.
Я рекомендую Essential COM by Don Box для дальнейшего чтения по этой теме.
Ответ 2
Короче: Нет.
Вам не нужно вызывать AddRef в вашем коде.
Ссылочный счетчик, для которого COM-объект имеет значение 1 после CoCreateInstance.
Итак, если вы вызываете Release, счетчиком ссылок будет 0, а объект COM будет удален.
Ответ 3
Одно исключение из правила: CComObject < > :: CreateInstance() НЕ выполняет AddRef. Вы должны сделать это после того, как позвоните.