Передача CComPtr в функцию с прототипом необработанного указателя

Я прохожу некоторый унаследованный код C ++, связанный с библиотекой компонентов Windows Imaging, и заметил следующее:

void setProperties(IPropertyBag2* const pBag)
{
pBag->Write(...);
}

void other_function()
{
CComPtr<IPropertyBag2> pBag;
//Code to initialize pBag
setProperties(pBag);
}

setProperties Метод просто записывает набор свойств в пакет свойств.
Код компилируется и работает нормально, потому что я думаю, что он вызывает соответствующий оператор приведения типов.

У меня вопрос, рекомендуется ли такой интерфейс или есть лучший способ передачи указателя.
Например, есть ли разница (с точки зрения безопасности / производительности), если подпись была изменена на:

void setProperties(const CComPtr<IPropertyBag2>& pBag)

5

Решение

Необработанные указатели интерфейса — это канонический способ работы с COM-объектами. Они также самые гибкие. Использование ссылки на CComPtr свяжет вас с использованием CComPtr всегда.

Любой указатель COM, даже тупой, автоматически становится умным указателем, поскольку сам объект реализует AddRef а также Release, Если функция не хранит копию указателя, нет необходимости беспокоиться об этом.

Для удобства тип CComPtr автоматически приведёт себя к необработанному указателю.

2

Другие решения

Использование параметра CComPtr не так много преимуществ (если только он не является константным, и вы не собираетесь его изменять). CComPtr более полезен для локальных переменных и переменных экземпляра.

Но это нормально, если это только вопрос стиля / последовательности.

1

По вопросам рекламы [email protected]