Здравствуйте, Naigs, Вы писали:
N>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект. N>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта. N>Но самое главное, что это нужно сделать "на лету". N>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
Непонятно, что значит "преобразовать обычный объект в COM объект"???
1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
2. Если тебе нужно, чтобы обычный объект наряду со своей функциональностью, реализовывал какой-то интерфейс, реализация которого уже есть в каком-то com-объекте, ты можешь сделать следующее:
1) Отнаследовать класс объекта от нужного интерфейса(под нужным подразумеваю интерфейс который ты будешь запрашивать у com-объекта)
2) При обращении к одному из методов этого интерфеса, создаешь com-объект и вызываешь у него соответсвуюший метод.
Таким образом ты инкапсулируешь внутри своего класса работу с нужным тебе com-объектом.
3. Ну и последнее, если тебе просто необходимо динамически добавить объекту новые обязанности воспользуйся паттерном "Декоратор".
Здравствуйте, Naigs, Вы писали:
N>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.
Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект.
Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
Но самое главное, что это нужно сделать "на лету".
Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
Здравствуйте, michae1, Вы писали:
M>Здравствуйте, Naigs, Вы писали:
N>>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект. N>>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта. N>>Но самое главное, что это нужно сделать "на лету". N>>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
M>Непонятно, что значит "преобразовать обычный объект в COM объект"???
M>1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
Здравствуйте, michae1, Вы писали:
M>Здравствуйте, Naigs, Вы писали:
M>>>1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
N>>michae1, а можно по конкретней которая статься, а то что-то в оглавление так не вижу.
M>"Статьи" -> "COM/DCOM/COM+" -> "Основы" -> "Введение в COM"
michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.
Здравствуйте, Naigs, Вы писали:
N>Здравствуйте, michae1, Вы писали:
N>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.
Сделать это у вас не получиться, потому что сделать это нельзя впринципе Дело в том, что com-объект — это не просто объект реализующий какой-то интерфейс. Любой com-объект имеет вполне определенную структуру, требует регистрации в реестре и т.д. Почитайте статью и вам все станет понятно. Ну и еще, по-моему, такой задачи в процессе разработке возникать недолжно — это явно ошибка в проектировании.
Здравствуйте, michae1, Вы писали:
M>Здравствуйте, Naigs, Вы писали:
N>>Здравствуйте, michae1, Вы писали:
N>>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.
M>Сделать это у вас не получиться, потому что сделать это нельзя впринципе Дело в том, что com-объект — это не просто объект реализующий какой-то интерфейс. Любой com-объект имеет вполне определенную структуру, требует регистрации в реестре и т.д. Почитайте статью и вам все станет понятно. Ну и еще, по-моему, такой задачи в процессе разработке возникать недолжно — это явно ошибка в проектировании.
COM объект можно сделать наследником нашего класса, и он будет зарегистрирован после компиляции.
Вот есть статья там написано как динамически создавать интерфейс и добавлять методы, только вот метод добавления методов на вход получает строки, т.е. имя и параметры в виде строк. То есть, если мой класс сделать наследником этого класса, то интерфейс динамически создать получиться, но не получиться перекинуть методы класса на интерфейс.
Здравствуйте, Naigs, Вы писали:
N>>>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.
M>>Сделать это у вас не получиться, потому что сделать это нельзя в принципе Дело в том, что com-объект — это не просто объект реализующий какой-то интерфейс. Любой com-объект имеет вполне определенную структуру, требует регистрации в реестре и т.д. Почитайте статью и вам все станет понятно. Ну и еще, по-моему, такой задачи в процессе разработке возникать недолжно — это явно ошибка в проектировании.
N>COM объект можно сделать наследником нашего класса, и он будет зарегистрирован после компиляции.
N>Вот есть статья там написано как динамически создавать интерфейс и добавлять методы, только вот метод добавления методов на вход получает строки, т.е. имя и параметры в виде строк. То есть, если мой класс сделать наследником этого класса, то интерфейс динамически создать получиться, но не получиться перекинуть методы класса на интерфейс.
Поглядел статью, мое ИМХО: это криво Основная идея статьи, по-моему, такова:
The end result of all of this is that you now have an object that can be used by a scripting host or anything that accepts an IDispatch interface
т.е. о преобразовании объекта в com-объект речи нет. Более того, поскольку там используется наследование мне вообще мало понятно как оно будет работать "на лету".
Re: Пробразование объекта в COM объект.
От:
Аноним
Дата:
10.07.09 06:16
Оценка:
Здравствуйте, Naigs, Вы писали:
N>Здравствуйте.
N>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект. N>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта. N>Но самое главное, что это нужно сделать "на лету".
N>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
Вам стоило-бы более подробно описать ситуацию, уделив максимальное внимание деталям. В общем виде, как это описано у Вас, задача не решаема. Однако её можно решить для некоторого подмножества случаев. Я думаю, в первую очередь Вам следовало-бы осветить следующие моменты
Что это за объект. Как и кем он создаётся, где "живёт" — в EXE or DLL.
Что это за интерфейс. В какой момент становится известно его описание. Откуда о нём узнаёт клиент, откуда он знает, как этим интерфейсом пользоваться.
Каким образом предполагается увязывать методы объекта с методами интерфейса. Я имею в виду не техническую реализацию, а общие принципы.
Достаточно ли будет поддержки OLE-совместимых типов.
Какой уровень функциональности требуется от вновь испечённого COM-объекта. Должна ли существовать возможность создавать его посредством вызова стандартных сервисов COM, требуется ли межапартаментный маршалинг его интерфейсов.
Почему не подходит реализация задуманного через IDispatch.Invoke. Не так уж и велики будут накладные расходы, особенно учитывая необычность ситуации
В качестве общих рассуждений — в принципе, интерфейс — всего лишь таблица с адресами функций, реализующих его методы. Нет никаких препятствий для создания такой таблицы вручную, в том числе и в Run-Time. Но определённую сложность представляет организация поддержки такого интерфейса со стороны подсистемы COM.
Так-же на лету можно сгенерировать таблицу соответствия "Имя метода" -> "Адрес функции" + "описание параметров", и использовать её в IDispatch.Invoke.
Также есть возможность сгенерировать "на лету" Type Information и её перепоручить реализацию IDispatch.Invoke.
Однако все эти способы требуют приличных трудозатрат и достаточно хороших знаний в области интерфейсов вообще и их применения в COM в частности. Поэтому Вам стоило бы подробно описать саму задачу целиком. Возможно, существует иной, более "цивилизованный" путь её решения.
Re[2]: Пробразование объекта в COM объект.
От:
Аноним
Дата:
10.07.09 06:23
Оценка:
То есть общий подход может быть таким:
Создаётся некий универсальный COM-объект, который в Run-time по Вашему заказу создаёт и аггрегирует интересующий Вас объект и потом переадресует ему вызова методов интерфейса.
Здравствуйте, Naigs, Вы писали:
N>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект. N>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
Нечто похожее есть в MFC — класс CCmdTarget. Достаточно описать dispatch map и поставить свойство Enable Automation. Вариант для ATL есть здесь.
N>Но самое главное, что это нужно сделать "на лету". N>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
Если это объекты ваших классов, для которых определен dispatch map, то (как в случае CCmdTarget) вызываете GetIDispatch или FromIDispatch для преобразования указателя на объект в интерфейс и обратно. Но если это любой произвольный объект, то вам нужно будет динамически как-то создавать dispatch map, которая мапит свойства и методы интерфейса в public свойства и методы объекта. А для этого нужно в run-time как-то получать информацию о типах объекта, нужно нечто типа .NET Reflection.
Здравствуйте, Naigs, Вы писали:
N>Здравствуйте.
N>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект. N>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта. N>Но самое главное, что это нужно сделать "на лету".
N>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
В C++ (как и AFAIK во многих других языках) задача добавления новых методов к объекту во время исполнения неразрешима.
Т.е. уже созданному объекту во время выполнения программы вообще нельзя "навесть интерфейс" (IUnknown в случае COM), т.е. добавить новые методы (методы этого интерфейса) динамически уже созданному объекту не получится. Это же блин не скриптовый язык
И кстати, в C++ вообще нельзя добавить метод объекту, его можно добавить только классу, т.е. всем объектам этого класса. Т.е. если у нас есть два объекта одного и того же класса, то набор методов (интерфейсов) у них будет одинаковый
В общем все это IMHO означает, что ваш объект должен поддерживать COM-интерфейс IUnknown (ну или IDispatch) изначально (т.е. изначально быть COM-объектом).
Здравствуйте, bnk, Вы писали:
N>>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект. N>>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта. N>>Но самое главное, что это нужно сделать "на лету".
N>>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
bnk>В C++ (как и AFAIK во многих других языках) задача добавления новых методов к объекту во время исполнения неразрешима.
Упс. Что это я про C++ кстати.
Что у вас за объект-то который нужно преобразовать? Он вообще где? На каком языке написан, в какой среде находится?
Т.е. как ваш COM-объект реализован "физически"? Может там и можно такое сделать.
Передо мной поставили новую задачу. Есть С++ объект, создается динамически, нужно написать COM оболочку на JScript.
Так как с JScript я еще не знаком(да и вообще особо не владею скриптовыми языками), возникли следующие вопросы:
1) Как происходит взаимодействие обычного языка(С++) со скриптовым? Конкретно, как используется обин язык в другом.
2) Как на JScrtip создать простейший COM объект?
3) Где можно найти хорошую документацию по JSript (кроме MSDN ?
Здравствуйте, Naigs, Вы писали:
N>Задача оказалась действительно сложной.
N>Передо мной поставили новую задачу. Есть С++ объект, создается динамически, нужно написать COM оболочку на JScript.
Может быть все же
не "Написать на JScript COM-оболочку для объекта написанного на C++",
а "Написать на C++ COM-оболочку для работы из JScript с объектом, написанным на С++"?
Вы уточните, а то первая задача AFAIK неразрешима, вторая же является типовой.
Re[3]: Пробразование объекта в COM объект.
От:
Аноним
Дата:
12.07.09 10:01
Оценка:
Здравствуйте, bnk, Вы писали:
bnk>Может быть все же bnk>не "Написать на JScript COM-оболочку для объекта написанного на C++", bnk>а "Написать на C++ COM-оболочку для работы из JScript с объектом, написанным на С++"?
bnk>Вы уточните, а то первая задача AFAIK неразрешима, вторая же является типовой.
Здравствуйте, bnk, Вы писали:
bnk>Может быть все же bnk>не "Написать на JScript COM-оболочку для объекта написанного на C++", bnk>а "Написать на C++ COM-оболочку для работы из JScript с объектом, написанным на С++"?
bnk>Вы уточните, а то первая задача AFAIK неразрешима, вторая же является типовой.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, bnk, Вы писали:
bnk>>Может быть все же bnk>>не "Написать на JScript COM-оболочку для объекта написанного на C++", bnk>>а "Написать на C++ COM-оболочку для работы из JScript с объектом, написанным на С++"?
bnk>>Вы уточните, а то первая задача AFAIK неразрешима, вторая же является типовой.
А>bnk, да вы правы, спасибо за исправление
Ну тогда наверное это можно сделать по большому счету визардом:
— Создаете визардом новый COM-объект (Project -> Add Class -> ATL Simple Object)
— добавляете в него методы, которые должны быть доступны из скриптиа, обращая внимание на типы аргуметов — там не могут быть любые типы (тоже можно визардом).
— Добавляете ваш объект как поле этого нового COM-объекта
— В методе FinalConstruct() COM-объекта (генерируется визардом) создаете ваш объект
— В методе FinalRelease() удаляете ваш объект
— Реализацию каждого метода перенаправляете на вызов соответствующего метода своего объекта.
Наверное как-то так
Re[2]: Пробразование объекта в COM объект.
От:
Аноним
Дата:
12.07.09 15:42
Оценка:
И все таки меня интересует вопрос: как на JScrtip создать простейший COM объект