Уважаемые знатоки,
существует ли возможность работать с экземплярами собственных классов в своем СОМ-объекте непосредственно, не через интерфейс? (C++)
С managed объектами проблем нет — существует замечательный метод Marshal::GetObjectForIUnknown.
Есть ли альтернатива для неуправляемых классов?
Или надо все перепахивать на __gc?
Мой СОМ-сервер преобразует данные, дофига работы с собственными классами, и многие методы внутренние, их совсем не нужно вытаскивать наружу черех интерфейс...
Здравствуйте nf, Вы писали:
nf>Уважаемые знатоки, nf>существует ли возможность работать с экземплярами собственных классов в своем СОМ-объекте непосредственно, не через интерфейс? (C++) nf>С managed объектами проблем нет — существует замечательный метод Marshal::GetObjectForIUnknown. nf>Есть ли альтернатива для неуправляемых классов? nf>Или надо все перепахивать на __gc? nf>Мой СОМ-сервер преобразует данные, дофига работы с собственными классами, и многие методы внутренние, их совсем не нужно вытаскивать наружу черех интерфейс...
Почему нет? можно сделать приватный интерфейс, можно просто возвращать ссылку на класс — по желанию...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте nf, Вы писали:
nf>Уважаемые знатоки, nf>существует ли возможность работать с экземплярами собственных классов в своем СОМ-объекте непосредственно, не через интерфейс? (C++)
попробуй просто сделать кастинг к своему классу реализующему ком-объект. по крайней мере под отладчиком (в Watch'е) это точно прокатывает — значит должно и так.
а для создания ком-объектов посмотри CComCreator / CComCreator2 (это если ATL)
Konstantin Trunin http://blog.trunin.com — эффективное управление людьми, проектами, собой
Здравствуйте TK, Вы писали:
TK>Почему нет? можно сделать приватный интерфейс, можно просто возвращать ссылку на класс — по желанию...
Сорри, а как возвращать ссылку на класс? Имея в виду, что я создаю его ВСЕГДА через CoCreateInstance (или IxxxPtr, неважно) — я должен поработать с ним и передать.
Насчет прямой ссылки нигде не нарыл
Здравствуйте nf, Вы писали:
nf>Здравствуйте TK, Вы писали:
TK>>Почему нет? можно сделать приватный интерфейс, можно просто возвращать ссылку на класс — по желанию...
nf>Сорри, а как возвращать ссылку на класс? Имея в виду, что я создаю его ВСЕГДА через CoCreateInstance (или IxxxPtr, неважно) — я должен поработать с ним и передать. nf>Насчет прямой ссылки нигде не нарыл
Например через QueryInterface. Определить свой приватный IID и по нему просто возвращать указатель на класс...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте Joker3D, Вы писали:
JD>попробуй просто сделать кастинг к своему классу реализующему ком-объект. по крайней мере под отладчиком (в Watch'е) это точно прокатывает — значит должно и так.
JD>а для создания ком-объектов посмотри CComCreator / CComCreator2 (это если ATL)
Да не работает кастинг естессно! CComCreator-а в MSDN нет, хотя класс в ATL действительно описан. Будем смотреть...
Здравствуйте TK, Вы писали:
TK>Например через QueryInterface. Определить свой приватный IID и по нему просто возвращать указатель на класс...
Чего-то я то ли ослаб головой, то ли не въезжаю. Если определяю отдельный приватный интерфейс (я правильно понял?), то какой мне собственно с него прок кроме приватности? Методы я и в "официальных" интерфейсах могу прикрыть. Мне надо работать с объектом непосредственно, через (например) указатель на него, а не на интерфейс.
Здравствуйте nf, Вы писали:
nf>Здравствуйте TK, Вы писали:
TK>>Например через QueryInterface. Определить свой приватный IID и по нему просто возвращать указатель на класс...
nf>Чего-то я то ли ослаб головой, то ли не въезжаю. Если определяю отдельный приватный интерфейс (я правильно понял?), то какой мне собственно с него прок кроме приватности? Методы я и в "официальных" интерфейсах могу прикрыть. Мне надо работать с объектом непосредственно, через (например) указатель на него, а не на интерфейс. nf>
Можно никаких интерфейсов не определять. Переопределяешь QueryInterface. При запросе определенного IID просто копируешь в ppvObj this. На выходе приводишь этот указатель к указателю на свой класс. Единственное, что не стоит потом с этот this через CComPtr использовать.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте nf, Вы писали:
nf>Здравствуйте Joker3D, Вы писали:
JD>>попробуй просто сделать кастинг к своему классу реализующему ком-объект. по крайней мере под отладчиком (в Watch'е) это точно прокатывает — значит должно и так.
JD>>а для создания ком-объектов посмотри CComCreator / CComCreator2 (это если ATL)
nf>Да не работает кастинг естессно! CComCreator-а в MSDN нет, хотя класс в ATL действительно описан. Будем смотреть...
а у меня кастинг работает!!!
специально только что еще раз проверил:
а CComCreator-ы нужны чтобы создать ATL-ком-класс как ком-объект (т.е. с AddRef'ом и всем чем надо) но через C++-класс его реализующий (подробнее я написано в "ATL Internals")
Konstantin Trunin http://blog.trunin.com — эффективное управление людьми, проектами, собой
JD>работает! (и нефиг в меня нулями кидаться!
JD> JD>а CComCreator-ы нужны чтобы создать ATL-ком-класс как ком-объект (т.е. с AddRef'ом и всем чем надо) но через C++-класс его реализующий (подробнее я написано в "ATL Internals")
Точно! Сгоряча не тот интерфейс приводил
Я это с самого начала пробовал, но вот ошибочка вышла...
Спасибо!
Здравствуйте TK, Вы писали:
TK>Можно никаких интерфейсов не определять. Переопределяешь QueryInterface. При запросе определенного IID просто копируешь в ppvObj this. На выходе приводишь этот указатель к указателю на свой класс. Единственное, что не стоит потом с этот this через CComPtr использовать.
Ну да, точно. Тривиальная вроде мысля, сгоряча сначала не тот интерфейс подставил а потом не посмотрел.
Спасибо!
Чисто теоретически в отладочной версии такое работать не должно. связано это с реализацией InternalQueryInterface. т.к. там возвращается указатель не на реальный объект а на некую штуку которая реализует некоторые отладочные сервисы...
Хотя, в Release все должно быть ОК
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте TK, Вы писали:
TK>Чисто теоретически в отладочной версии такое работать не должно. связано это с реализацией InternalQueryInterface. т.к. там возвращается указатель не на реальный объект а на некую штуку которая реализует некоторые отладочные сервисы...
в отладочной и проверял ))
Konstantin Trunin http://blog.trunin.com — эффективное управление людьми, проектами, собой
Здравствуйте Joker3D, Вы писали:
JD>Здравствуйте TK, Вы писали:
TK>>Чисто теоретически в отладочной версии такое работать не должно. связано это с реализацией InternalQueryInterface. т.к. там возвращается указатель не на реальный объект а на некую штуку которая реализует некоторые отладочные сервисы...
JD>в отладочной и проверял ))
определи _ATL_DEBUG_INTERFACES и все посыпется.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.