![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Konst |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
В заголовочном файле описан интерфейс.
Как мне на основе этого интерфейса инициализировать COM объект прям в функции main? При этом что бы не экспортировать сначала в библиотеку, а потом ее подцеплять и из библиотеки инициализировать интерфейс! |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Не совсем понятно. Используй CoCreateInstance с указанием того интерфейса, который нужен. Или ты хочешь без реестра обойтись? Тогда можно попробывать загрузить dll COM-компанента и вызвать функцию DllGetClassObject.
|
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Именно main? Была тут тема, навроде "Как инициализировать COM-библиотеку на чистом WinAPI.". В двух словах сошлись на мнении, что лучше воспользоваться услугами готовых библиотек, чем отлаживать свой код. |
|||
|
||||
Konst |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
Да. Тут видимо без библиотек не обойтись.
![]() |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
А что там ее инициализировать? CoInitialize и все дела. А если надо загрузить COM объект, тогда в простом случае подойдет LoadLibrary+DllGetClassObject. -------------------- Волны гасят ветер... |
|||
|
||||
Konst |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
2Fantasist
Ты видимо не так вопрос понял. Мне собственно нужно инициализировать instance. CoCreateInstance - создает мне COM на интерфейсе, который лежит в dll и еще прописан в регистрах. А я бы хотел создать COM объект на основе интерфейса, который у меня тут же описан в заголовочном файле, и зарегистрировать этот COM в ROT. |
|||
|
||||
Konst |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
Как инициализировать COM-библиотеку на чистом WinAPI - не могу найти эту тему. Киньте ссылку пожалуйста.
|
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Это уже не COM. Это просто интерфейс:
namespace CommonInterface { public __gc __interface interface1 { public: int ReturnInt(); }; public __gc class class1:public interface1 { public: int ReturnInt() { return 6; } }; } CommonInterface::class1 *obj = new CommonInterface::class1; Вот тебе и объект obj, поддерживающий твой интерфейс |
|||
|
||||
Konst |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
2RAN
А зарегистрировать в ROT этот объект можно? Мне это нужно, что бы из другого COM объекта получить ссылку на этот объект. |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
RegisterActiveObject. Но надо, чтоб был реализован IUnknown.
|
|||
|
||||
Konst |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
RAN
Напиши пример. Я так пробовал. Но не выходило. Интерфейс, наследуемый через IUnknown делал. А как к нему гайд приписать? RegisterActiveObject как я понимаю требует CLSID, а ищет он этот идентификатор в регистре. А так как я из своего интерфейса библиотеку не делал, то ничего в регистрах и нет. И получается, что не регистрирует нифига (я просто подсовывал случайный гайд конечно, но надеялся, что он его привяжет к моему интерфейсу). |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Хм. Попробую когда время будет. Обещаю скоро ответить.
|
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Опа, так у тебя получается локальный сервер? А IMarshal ты реализовал? Я так ведь понимаю, что библиотеки типов у тебя нету?
А так, что мешает тебе прописать в реестр необходимую инфу, прежде чем создавать свой объект и регестрировать его через RegisterActiveObject? -------------------- Волны гасят ветер... |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Блин, а Fantasist прав. Придётся маршалер делать. Однако RegisterActiveObject регистрирует OLE-сервер и без записи в реестре. По крайней мере, возвращает 0. Так что, это реально, но сложно.
|
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Я вообще-то тоже так думал, но никогда не проверял. На мой взгляд, в реестре информация нужна для создания объекта (т.е. нахождения кода объекта по ProgID/CLSID). Однако, после RegisterActiveObject ты пробывал вызвать GetActiveObject? Думаю, должно работать, но стоит убедиться. Правда дальше IUnknown/IDispatch не уедешь, но и этого должно хватить. -------------------- Волны гасят ветер... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |