работа с собственными unmanaged объектами
От: nf Россия  
Дата: 24.09.02 10:41
Оценка:
Уважаемые знатоки,
существует ли возможность работать с экземплярами собственных классов в своем СОМ-объекте непосредственно, не через интерфейс? (C++)
С managed объектами проблем нет — существует замечательный метод Marshal::GetObjectForIUnknown.
Есть ли альтернатива для неуправляемых классов?
Или надо все перепахивать на __gc?
Мой СОМ-сервер преобразует данные, дофига работы с собственными классами, и многие методы внутренние, их совсем не нужно вытаскивать наружу черех интерфейс...
Fedor
Re: работа с собственными unmanaged объектами
От: TK Лес кывт.рф
Дата: 24.09.02 10:47
Оценка: 1 (1)
Здравствуйте nf, Вы писали:

nf>Уважаемые знатоки,

nf>существует ли возможность работать с экземплярами собственных классов в своем СОМ-объекте непосредственно, не через интерфейс? (C++)
nf>С managed объектами проблем нет — существует замечательный метод Marshal::GetObjectForIUnknown.
nf>Есть ли альтернатива для неуправляемых классов?
nf>Или надо все перепахивать на __gc?
nf>Мой СОМ-сервер преобразует данные, дофига работы с собственными классами, и многие методы внутренние, их совсем не нужно вытаскивать наружу черех интерфейс...

Почему нет? можно сделать приватный интерфейс, можно просто возвращать ссылку на класс — по желанию...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: работа с собственными unmanaged объектами
От: Joker3D Россия http://blog.trunin.com
Дата: 24.09.02 10:52
Оценка: 11 (1) -1
Здравствуйте nf, Вы писали:

nf>Уважаемые знатоки,

nf>существует ли возможность работать с экземплярами собственных классов в своем СОМ-объекте непосредственно, не через интерфейс? (C++)

попробуй просто сделать кастинг к своему классу реализующему ком-объект. по крайней мере под отладчиком (в Watch'е) это точно прокатывает — значит должно и так.

а для создания ком-объектов посмотри CComCreator / CComCreator2 (это если ATL)
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[2]: работа с собственными unmanaged объектами
От: nf Россия  
Дата: 24.09.02 11:16
Оценка:
Здравствуйте TK, Вы писали:

TK>Почему нет? можно сделать приватный интерфейс, можно просто возвращать ссылку на класс — по желанию...


Сорри, а как возвращать ссылку на класс? Имея в виду, что я создаю его ВСЕГДА через CoCreateInstance (или IxxxPtr, неважно) — я должен поработать с ним и передать.
Насчет прямой ссылки нигде не нарыл
Fedor
Re[3]: работа с собственными unmanaged объектами
От: TK Лес кывт.рф
Дата: 24.09.02 11:18
Оценка:
Здравствуйте nf, Вы писали:

nf>Здравствуйте TK, Вы писали:


TK>>Почему нет? можно сделать приватный интерфейс, можно просто возвращать ссылку на класс — по желанию...


nf>Сорри, а как возвращать ссылку на класс? Имея в виду, что я создаю его ВСЕГДА через CoCreateInstance (или IxxxPtr, неважно) — я должен поработать с ним и передать.

nf>Насчет прямой ссылки нигде не нарыл

Например через QueryInterface. Определить свой приватный IID и по нему просто возвращать указатель на класс...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: работа с собственными unmanaged объектами
От: nf Россия  
Дата: 24.09.02 11:19
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>попробуй просто сделать кастинг к своему классу реализующему ком-объект. по крайней мере под отладчиком (в Watch'е) это точно прокатывает — значит должно и так.


JD>а для создания ком-объектов посмотри CComCreator / CComCreator2 (это если ATL)


Да не работает кастинг естессно! CComCreator-а в MSDN нет, хотя класс в ATL действительно описан. Будем смотреть...
Fedor
Re[4]: работа с собственными unmanaged объектами
От: nf Россия  
Дата: 24.09.02 11:25
Оценка:
Здравствуйте TK, Вы писали:

TK>Например через QueryInterface. Определить свой приватный IID и по нему просто возвращать указатель на класс...


Чего-то я то ли ослаб головой, то ли не въезжаю. Если определяю отдельный приватный интерфейс (я правильно понял?), то какой мне собственно с него прок кроме приватности? Методы я и в "официальных" интерфейсах могу прикрыть. Мне надо работать с объектом непосредственно, через (например) указатель на него, а не на интерфейс.
Fedor
Re[5]: работа с собственными unmanaged объектами
От: TK Лес кывт.рф
Дата: 24.09.02 11:33
Оценка: 3 (1)
Здравствуйте nf, Вы писали:

nf>Здравствуйте TK, Вы писали:


TK>>Например через QueryInterface. Определить свой приватный IID и по нему просто возвращать указатель на класс...


nf>Чего-то я то ли ослаб головой, то ли не въезжаю. Если определяю отдельный приватный интерфейс (я правильно понял?), то какой мне собственно с него прок кроме приватности? Методы я и в "официальных" интерфейсах могу прикрыть. Мне надо работать с объектом непосредственно, через (например) указатель на него, а не на интерфейс.

nf>

Можно никаких интерфейсов не определять. Переопределяешь QueryInterface. При запросе определенного IID просто копируешь в ppvObj this. На выходе приводишь этот указатель к указателю на свой класс. Единственное, что не стоит потом с этот this через CComPtr использовать.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: работа с собственными unmanaged объектами
От: Joker3D Россия http://blog.trunin.com
Дата: 24.09.02 11:37
Оценка: 3 (1)
Здравствуйте nf, Вы писали:

nf>Здравствуйте Joker3D, Вы писали:


JD>>попробуй просто сделать кастинг к своему классу реализующему ком-объект. по крайней мере под отладчиком (в Watch'е) это точно прокатывает — значит должно и так.


JD>>а для создания ком-объектов посмотри CComCreator / CComCreator2 (это если ATL)


nf>Да не работает кастинг естессно! CComCreator-а в MSDN нет, хотя класс в ATL действительно описан. Будем смотреть...


а у меня кастинг работает!!!
специально только что еще раз проверил:

HRESULT hr = m_pMainGroupObject.CoCreateInstance( CLSID_AndySimpleGroupObject );
if( FAILED( hr ) )
    return hr;

CAndySimpleGroupObject* pGr = ( CAndySimpleGroupObject* )m_pMainGroupObject.p;
pGr->AddRef();
pGr->Release();

работает! (и нефиг в меня нулями кидаться!


а CComCreator-ы нужны чтобы создать ATL-ком-класс как ком-объект (т.е. с AddRef'ом и всем чем надо) но через C++-класс его реализующий (подробнее я написано в "ATL Internals")
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[5]: Cx* из Ix*
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.09.02 11:48
Оценка: 3 (1)
Здравствуйте nf, Вы писали:

nf>Мне надо работать с объектом непосредственно, через (например) указатель на него, а не на интерфейс.


Посмотри вот эту ссылку ИНФО: Как получить Cx из Ix*
Автор: Vi2
Дата: 17.06.02
и обсуждение в ней.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: работа с собственными unmanaged объектами
От: nf Россия  
Дата: 24.09.02 11:54
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>а у меня кастинг работает!!!

JD>специально только что еще раз проверил:

JD>
JD>HRESULT hr = m_pMainGroupObject.CoCreateInstance( CLSID_AndySimpleGroupObject );
JD>if( FAILED( hr ) )
JD>    return hr;

JD>CAndySimpleGroupObject* pGr = ( CAndySimpleGroupObject* )m_pMainGroupObject.p;
pGr->>AddRef();
pGr->>Release();
JD>

JD>работает! (и нефиг в меня нулями кидаться!

JD>

JD>а CComCreator-ы нужны чтобы создать ATL-ком-класс как ком-объект (т.е. с AddRef'ом и всем чем надо) но через C++-класс его реализующий (подробнее я написано в "ATL Internals")

Точно! Сгоряча не тот интерфейс приводил
Я это с самого начала пробовал, но вот ошибочка вышла...
Спасибо!
Fedor
Re[6]: работа с собственными unmanaged объектами
От: nf Россия  
Дата: 24.09.02 11:56
Оценка:
Здравствуйте TK, Вы писали:

TK>Можно никаких интерфейсов не определять. Переопределяешь QueryInterface. При запросе определенного IID просто копируешь в ppvObj this. На выходе приводишь этот указатель к указателю на свой класс. Единственное, что не стоит потом с этот this через CComPtr использовать.


Ну да, точно. Тривиальная вроде мысля, сгоряча сначала не тот интерфейс подставил а потом не посмотрел.
Спасибо!
Fedor
Re[4]: работа с собственными unmanaged объектами
От: TK Лес кывт.рф
Дата: 24.09.02 12:02
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>а у меня кастинг работает!!!

JD>специально только что еще раз проверил:

JD>
JD>HRESULT hr = m_pMainGroupObject.CoCreateInstance( CLSID_AndySimpleGroupObject );
JD>if( FAILED( hr ) )
JD>    return hr;

JD>CAndySimpleGroupObject* pGr = ( CAndySimpleGroupObject* )m_pMainGroupObject.p;
pGr->>AddRef();
pGr->>Release();
JD>

JD>работает! (и нефиг в меня нулями кидаться!

Чисто теоретически в отладочной версии такое работать не должно. связано это с реализацией InternalQueryInterface. т.к. там возвращается указатель не на реальный объект а на некую штуку которая реализует некоторые отладочные сервисы...

Хотя, в Release все должно быть ОК
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: работа с собственными unmanaged объектами
От: Joker3D Россия http://blog.trunin.com
Дата: 24.09.02 12:23
Оценка:
Здравствуйте TK, Вы писали:

TK>Чисто теоретически в отладочной версии такое работать не должно. связано это с реализацией InternalQueryInterface. т.к. там возвращается указатель не на реальный объект а на некую штуку которая реализует некоторые отладочные сервисы...


в отладочной и проверял ))
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[6]: работа с собственными unmanaged объектами
От: TK Лес кывт.рф
Дата: 24.09.02 12:51
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Здравствуйте TK, Вы писали:


TK>>Чисто теоретически в отладочной версии такое работать не должно. связано это с реализацией InternalQueryInterface. т.к. там возвращается указатель не на реальный объект а на некую штуку которая реализует некоторые отладочные сервисы...


JD>в отладочной и проверял ))


определи _ATL_DEBUG_INTERFACES и все посыпется.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.