| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Создать COM объект без библиотеки |
| Автор: Konst 10.9.2003, 08:03 | ||
В заголовочном файле описан интерфейс.
Как мне на основе этого интерфейса инициализировать COM объект прям в функции main? При этом что бы не экспортировать сначала в библиотеку, а потом ее подцеплять и из библиотеки инициализировать интерфейс! |
| Автор: RAN 10.9.2003, 12:37 |
| Не совсем понятно. Используй CoCreateInstance с указанием того интерфейса, который нужен. Или ты хочешь без реестра обойтись? Тогда можно попробывать загрузить dll COM-компанента и вызвать функцию DllGetClassObject. |
| Автор: DENNN 10.9.2003, 13:55 | ||
Именно main? Была тут тема, навроде "Как инициализировать COM-библиотеку на чистом WinAPI.". В двух словах сошлись на мнении, что лучше воспользоваться услугами готовых библиотек, чем отлаживать свой код. |
| Автор: Konst 10.9.2003, 17:16 |
| Да. Тут видимо без библиотек не обойтись. |
| Автор: Fantasist 11.9.2003, 02:35 | ||
А что там ее инициализировать? CoInitialize и все дела. А если надо загрузить COM объект, тогда в простом случае подойдет LoadLibrary+DllGetClassObject. |
| Автор: Konst 11.9.2003, 04:57 |
| 2Fantasist Ты видимо не так вопрос понял. Мне собственно нужно инициализировать instance. CoCreateInstance - создает мне COM на интерфейсе, который лежит в dll и еще прописан в регистрах. А я бы хотел создать COM объект на основе интерфейса, который у меня тут же описан в заголовочном файле, и зарегистрировать этот COM в ROT. |
| Автор: Konst 11.9.2003, 06:36 |
| Как инициализировать COM-библиотеку на чистом WinAPI - не могу найти эту тему. Киньте ссылку пожалуйста. |
| Автор: RAN 11.9.2003, 08:06 |
| Это уже не 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 11.9.2003, 08:36 |
| 2RAN А зарегистрировать в ROT этот объект можно? Мне это нужно, что бы из другого COM объекта получить ссылку на этот объект. |
| Автор: RAN 11.9.2003, 14:10 |
| RegisterActiveObject. Но надо, чтоб был реализован IUnknown. |
| Автор: Konst 11.9.2003, 14:15 |
| RAN Напиши пример. Я так пробовал. Но не выходило. Интерфейс, наследуемый через IUnknown делал. А как к нему гайд приписать? RegisterActiveObject как я понимаю требует CLSID, а ищет он этот идентификатор в регистре. А так как я из своего интерфейса библиотеку не делал, то ничего в регистрах и нет. И получается, что не регистрирует нифига (я просто подсовывал случайный гайд конечно, но надеялся, что он его привяжет к моему интерфейсу). |
| Автор: RAN 11.9.2003, 14:18 |
| Хм. Попробую когда время будет. Обещаю скоро ответить. |
| Автор: Fantasist 11.9.2003, 19:00 |
| Опа, так у тебя получается локальный сервер? А IMarshal ты реализовал? Я так ведь понимаю, что библиотеки типов у тебя нету? А так, что мешает тебе прописать в реестр необходимую инфу, прежде чем создавать свой объект и регестрировать его через RegisterActiveObject? |
| Автор: RAN 12.9.2003, 00:02 |
| Блин, а Fantasist прав. Придётся маршалер делать. Однако RegisterActiveObject регистрирует OLE-сервер и без записи в реестре. По крайней мере, возвращает 0. Так что, это реально, но сложно. |
| Автор: Fantasist 12.9.2003, 00:14 | ||
Я вообще-то тоже так думал, но никогда не проверял. На мой взгляд, в реестре информация нужна для создания объекта (т.е. нахождения кода объекта по ProgID/CLSID). Однако, после RegisterActiveObject ты пробывал вызвать GetActiveObject? Думаю, должно работать, но стоит убедиться. Правда дальше IUnknown/IDispatch не уедешь, но и этого должно хватить. |
| Автор: RAN 12.9.2003, 01:23 |
| GetActiveObject вызвал из другого приложения. Из того же не пробывал, но думаю это ничего не изменит. Тем более, что задача состоит в том, чтоб создать клиент в другом приложении. В результате GetActiveObject виснет. Надо бы будет проверить, вызывается ли QueryInterface в сервере и какие он запрашиваются интерфейсы. Так вот GetActiveObject не возвращает управление до тех пор, пока я не вызову RevokeActiveObject. Потом в клиенте происходит задержка на пару секунд и возврат из GetActiveObject с кодом ошибки. Revoke завершается успешно. Кстати, вызов GetActiveObject запрашивает у объекта кучу интерфейсов. В следующем порядке: IID_IProxyManager - возвращаю код - интерфейс не поддерживается IID_IMarshal - тоже ошибка, как и во всех остальных случаях {0000001B-0000-0000-C000-000000000046} - интересно, чего хочет IID_IUnknown - это я обрабатывал корректно IID_IStdMarshalInfo IID_IExternalConnection {4C1E39E1-E3E3-4296-AA86-EC938D896E92} - тоже не понятно Я думаю не надо всё это поддерживать, просто функция пыталась определить, как с моим объектом общаться. |