В COM: я должен вызвать AddRef после CoCreateInstance? - PullRequest
20 голосов
/ 14 марта 2009

Вызывает ли CoCreateInstance автоматический вызов AddRef для интерфейса, который я создаю, или я должен впоследствии вызывать его вручную?

Ответы [ 3 ]

25 голосов
/ 14 марта 2009

Контракт с COM заключается в любое время, когда вы получаете объект от такой функции, как, например, CoCreateInstance (), QueryInterface () (то, что в конечном итоге вызывает CoCreateInstance ()) и т. Д., Вызываемый всегда вызывает AddRef () до того, как возвращение, и вызывающий (вы) всегда Release (), когда вы закончите.

Вы можете использовать CComPtr <>, чтобы сделать это проще, и он просто делает правильные вещи.

Теперь, если вам нужно передать этот указатель другому объекту, который ожидает, что он будет использоваться по истечении времени жизни вашего объекта, то вам нужно вызвать AddRef () перед его выдачей.

Я рекомендую Essential COM от Don Box для дальнейшего чтения по этой теме.

9 голосов
/ 14 марта 2009

Короче говоря: Нет .

Вы не должны позвонить AddRef в свой код.

Счетчик ссылок, который COM-объект имеет, равен 1 после CoCreateInstance .

Итак, если вы позвоните Release , счетчик ссылок будет равен 0, а COM-объект будет удален.

4 голосов
/ 21 сентября 2012

Одно исключение из правила: CComObject <> :: CreateInstance () НЕ выполняет AddRef. Вы должны сделать это после того, как позвоните.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...