Создание COM - объекта без CoCreateInstance
От: misha_sk Россия  
Дата: 21.07.03 12:33
Оценка:
Существует такая необходимость, так есть некоторая иерархия объектов, т.е. подчиненные объекты должны иметь ссылочную информацию на их собственников, но выносить ее в интерфейс не хотелось бы. Поэтому я бы хочу создать объект класса С++, инициализировать, а потом уже вернуть ссылку на COM-интерфейс, который он реализует.
COM-объекты пишутся при помощи ATL.
Вопрос: как правильно инициализировать в этом случае объект?
Re: Создание COM - объекта без CoCreateInstance
От: SergH Россия  
Дата: 21.07.03 12:37
Оценка:
Здравствуйте, misha_sk, Вы писали:

_>Существует такая необходимость, так есть некоторая иерархия объектов, т.е. подчиненные объекты должны иметь ссылочную информацию на их собственников, но выносить ее в интерфейс не хотелось бы. Поэтому я бы хочу создать объект класса С++, инициализировать, а потом уже вернуть ссылку на COM-интерфейс, который он реализует.

_>COM-объекты пишутся при помощи ATL.
_>Вопрос: как правильно инициализировать в этом случае объект?

Я делаю примерно так:

    CComObject<CASPOEnumAccount>* pEnum = NULL;
    hr = CComObject<CASPOEnumAccount>::CreateInstance(&pEnum);

    if (FAILED(hr))
    {
        return hr;
    }

    pEnum->Init(pAccounts); // инициализация

    return pEnum->QueryInterface(pVal);


Где pVal — [out]-параметр функции, имеющий тип IASPOEnumAccount**
Делай что должно, и будь что будет
Re[2]: Создание COM - объекта без CoCreateInstance
От: misha_sk Россия  
Дата: 21.07.03 13:34
Оценка:
Большое спасибо!
Re[2]: Создание COM - объекта без CoCreateInstance
От: George Seryakov Россия  
Дата: 21.07.03 14:41
Оценка:
Здравствуйте, SergH, Вы писали:

_>>Существует такая необходимость, так есть некоторая иерархия объектов, т.е. подчиненные объекты должны иметь ссылочную информацию на их собственников, но выносить ее в интерфейс не хотелось бы.


SH>
SH>    CComObject<CASPOEnumAccount>* pEnum = NULL;
SH>    hr = CComObject<CASPOEnumAccount>::CreateInstance(&pEnum);

SH>    if (FAILED(hr))
SH>    {
SH>        return hr;
SH>    }

SH>    pEnum->Init(pAccounts); // инициализация

SH>    return pEnum->QueryInterface(pVal);
SH>


Ну и неплохо сослаться на Q181265, хотя трюк с поднятием счетчика (QI) там не описан.

Кстати — почему это MSDN online перестал показывать статью по Q-номеру?
GS
Re[3]: Создание COM - объекта без CoCreateInstance
От: SergH Россия  
Дата: 21.07.03 15:32
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Ну и неплохо сослаться на Q181265, хотя трюк с поднятием счетчика (QI) там не описан.


Я его не читал до этого момента Мне на этом же форуме рассказали, как правильно создавать объекты. А поднятие счётчика это же, к сожалению, не трюк, а жизеннная необходимость, странно что он не описан.
Делай что должно, и будь что будет
Re[3]: Создание COM - объекта без CoCreateInstance
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 21.07.03 15:42
Оценка:
Здравствуйте, George Seryakov, Вы писали:

[]

GS>Кстати — почему это MSDN online перестал показывать статью по Q-номеру?


Это почему трюк? Тебя попросили в pVal записть указатель на интерфейс. Самый разумный способ это сделать — QI. Это — основы!
Re[4]: Создание COM - объекта без CoCreateInstance
От: George Seryakov Россия  
Дата: 21.07.03 15:50
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Это почему трюк? Тебя попросили в pVal записть указатель на интерфейс. Самый разумный способ это сделать — QI. Это — основы!


Нет, в рамках С++ парадигмы саму разумный способ — откастить указатель на объект на указатель на интерфейс. И это будет правильно, за тем исключением, что счетчик ссылок будет нулевой. Его нужно поднять либо AddRef либо через QI. В чем и состоит трюк.
GS
Re[5]: Создание COM - объекта без CoCreateInstance
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 21.07.03 15:53
Оценка:
Здравствуйте, George Seryakov, Вы писали:

[]

GS>Нет, в рамках С++ парадигмы саму разумный способ — откастить указатель на объект на указатель на интерфейс. И это будет правильно, за тем исключением, что счетчик ссылок будет нулевой. Его нужно поднять либо AddRef либо через QI. В чем и состоит трюк.


Что есть С++ парадигма?

З.Ы. Работаешь с СОМ — работай по правилам СОМ, а не С++.
Re[6]: Создание COM - объекта без CoCreateInstance
От: George Seryakov Россия  
Дата: 21.07.03 16:01
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

GS>>Нет, в рамках С++ парадигмы саму разумный способ — откастить указатель на объект на указатель на интерфейс. И это будет правильно, за тем исключением, что счетчик ссылок будет нулевой. Его нужно поднять либо AddRef либо через QI. В чем и состоит трюк.


AS>Что есть С++ парадигма?


А С++ парадигма — это то, что ты спрашивал: как создать объект не через вызовы комовской библиотеки, а как нечто в скоупе С++ кода.

AS>З.Ы. Работаешь с СОМ — работай по правилам СОМ, а не С++.


Спорить можно, но бесполезно.
GS
Re[7]: Создание COM - объекта без CoCreateInstance
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 21.07.03 16:12
Оценка: +1
Здравствуйте, George Seryakov, Вы писали:

[]

У С++ нет парадигмы. Это язык подерживающий множество парадигм. Мне здается, что ты не совсем представляешь, что есть парадигма.
Re[8]: Создание COM - объекта без CoCreateInstance
От: MaximE Великобритания  
Дата: 22.07.03 11:22
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, George Seryakov, Вы писали:


AS>[]


AS>У С++ нет парадигмы. Это язык подерживающий множество парадигм. Мне здается, что ты не совсем представляешь, что есть парадигма.


James O. Coplien "Multi-Paradigm Design for C++"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.