2009-07-22 4 views
0

Я создал компонент COM-компонента под названием Test.dll, в котором я создал интерфейс IDiscover.В чем разница между распределением объекта-указателя двумя следующими способами?

Теперь я пришел к 2 способов распределения памяти, как

IDiscoverPtr id(__uuid(TestClass)); and Test::IDiscover *id=NULL; 

Что такое differnce между этими двумя .... Любая информация ценится ..

+0

Вы действительно выделяете что-либо во втором? – EFraim

ответ

2

Первый из них является смарт-указатель и Второй - обычный указатель.

Вам не нужно беспокоиться о Releasing Smart Pointer, тогда как вы должны явно указывать Release() обычный указатель интерфейса COM.

Для получения более подробной информации о смарт-указатели, Look Here

Кроме того, первый будет пытаться найти GUID из реестра для вашего класса с именем TestClass и будет пытаться создать экземпляр этого класса через CoCreateInstance API вызова , Он попытается получить указатель интерфейса через указанный вызов CoCreateInstance и выдает ошибку, если он этого не сделает. При успешном выполнении строки IDiscoverPtr id(__uuid(TestClass)); у вас должен быть действительный указатель интерфейса IDiscover в id.

Второй - это просто объявление указателя интерфейса, ничего больше. Вам придется создать экземпляр самостоятельно через (большую часть времени) CoCreateInstance или один из его вариантов.

1

Первый вариант - это умный указатель, второй - необработанный (обычный указатель). Умный указатель вызовет IUnknown :: Release() связанного объекта, когда он будет удален из области видимости. Необработанный указатель не сделает этого, и вы, возможно, получите утечку памяти, если вы не вызовете явный вызов IUnknown :: Release() явно в подходящий момент.

Первый вариант попытается создать экземпляр COM-объекта по его собственной конструкции (поскольку вы используете конструктор, параметризованный с идентификатором класса) и генерируете исключение, если это невозможно. Подробнее см. В источниках для _com_ptr_t (comip.h). Второй вариант даст вам указатель, инициализированный нулем - не связан с каким-либо объектом.

Умные указатели для COM-объектов имеют набор функций-членов, полезных для создания объектов и вызова QueryInterface() - это часто может уменьшить количество кода, необходимого для записи. С необработанным указателем вам придется вызвать CoCreateInstance() с несколькими параметрами, большинство из которых будут установлены по умолчанию, и это заставит вас написать больше кода. Снова см. Comip.h для полных источников _com_ptr_t - они вполне читаемы.

Общая рекомендация - использовать интеллектуальные указатели, если у вас нет реальных причин для этого.

+0

Так что нам не нужно вызывать CoCreate() при использовании __uuid («) right .... ??? – Cute

+0

С помощью умного указателя вы можете либо использовать его конструктор с помощью __uuid, либо использовать конструктор по умолчанию и вызвать _com_ptr :: CreateInstance() или вызовите глобальный CoCreateInstance() - что более подходит. Последний не будет генерировать исключение, а скорее возвращает HRESULT. – sharptooth

Смежные вопросы