Создать COM-объект внутри другого COM-объекта - PullRequest
3 голосов
/ 08 июня 2011

У меня есть следующий интерфейс.Интерфейс возвращает интерфейс ISystemCmds как часть метода GetSystemCommandInterface.Мы используем ATL для создания COM.

interface IDevice : IDispatch{  
 [id(1), helpstring("method Connect")] HRESULT Connect([in] VARIANT varPortNo);    
 [id(2), helpstring("method GetSystemCommandInterface")] HRESULT GetSystemCommandInterface([out,retval] ISystemCmds** pISystemCmd);    
};

Какой код следует добавить (и где) для создания COM-объекта для ISystemCmds, если

a.Я создаю COM-объект для ISystemCmds как часть создания COM-объекта IDevice?
b.Я создаю объект COM в методе GetSystemCommandInterface ()?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Используйте мастер ATL для создания реализации ISystemCmds. Затем создайте объект с помощью обычного CoCreateInstance или используйте шаблон CComObject <> (см. Метод CreateInstance), если вам нужно инициализировать объект способом, который ISystemCmds не поддерживает. Имейте в виду, что CComObject <> :: CreateInstance () не добавляет AddRef () для вашего объекта, как это делают QueryInterface () и CoCreateInstance (). AddRef объект, прежде чем передать его!

1 голос
/ 08 июня 2011

Получение новых COM-объектов - довольно сложная операция, поэтому я думаю, что вы должны рассмотреть вариант, в котором один класс реализует несколько интерфейсов, так как я думаю, что это совершенно правильное предположение о том, что ISystemCmds не переживет IDevice.Так что подумайте о реализации обоих интерфейсов с использованием одного класса и вызова QueryInterface внутри GetSystemCommandInterface.

...