Re: Пробразование объекта в COM объект.
От: michae1  
Дата: 09.07.09 08:25
Оценка: 7 (1)
Здравствуйте, Naigs, Вы писали:

N>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект.

N>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
N>Но самое главное, что это нужно сделать "на лету".
N>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.

Непонятно, что значит "преобразовать обычный объект в COM объект"???

1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.


2. Если тебе нужно, чтобы обычный объект наряду со своей функциональностью, реализовывал какой-то интерфейс, реализация которого уже есть в каком-то com-объекте, ты можешь сделать следующее:
1) Отнаследовать класс объекта от нужного интерфейса(под нужным подразумеваю интерфейс который ты будешь запрашивать у com-объекта)
2) При обращении к одному из методов этого интерфеса, создаешь com-объект и вызываешь у него соответсвуюший метод.
Таким образом ты инкапсулируешь внутри своего класса работу с нужным тебе com-объектом.

3. Ну и последнее, если тебе просто необходимо динамически добавить объекту новые обязанности воспользуйся паттерном "Декоратор".
Re[5]: Пробразование объекта в COM объект.
От: rus blood Россия  
Дата: 09.07.09 09:08
Оценка: +1
Здравствуйте, Naigs, Вы писали:

N>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.


А зачем такая задача?
Имею скафандр — готов путешествовать!
Пробразование объекта в COM объект.
От: Naigs  
Дата: 09.07.09 05:41
Оценка:
Здравствуйте.

Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект.
Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
Но самое главное, что это нужно сделать "на лету".

Я не представляю, как это возможно сделать. По возможности, можно по подробнее.
Re[2]: Пробразование объекта в COM объект.
От: Naigs  
Дата: 09.07.09 08:49
Оценка:
Здравствуйте, michae1, Вы писали:

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


N>>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект.

N>>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
N>>Но самое главное, что это нужно сделать "на лету".
N>>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.

M>Непонятно, что значит "преобразовать обычный объект в COM объект"???


M>1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.


michae1, а можно по конкретней которая статься, а то что-то в оглавление так не вижу.
Re[3]: Пробразование объекта в COM объект.
От: michae1  
Дата: 09.07.09 08:53
Оценка:
Здравствуйте, Naigs, Вы писали:

M>>1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.


N>michae1, а можно по конкретней которая статься, а то что-то в оглавление так не вижу.


"Статьи" -> "COM/DCOM/COM+" -> "Основы" -> "Введение в COM"
Re[4]: Пробразование объекта в COM объект.
От: Naigs  
Дата: 09.07.09 08:58
Оценка:
Здравствуйте, michae1, Вы писали:

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


M>>>1. Если тебе нужно сделать из существующего класса com-объект, то вот статейка о com:здесь
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.


N>>michae1, а можно по конкретней которая статься, а то что-то в оглавление так не вижу.


M>"Статьи" -> "COM/DCOM/COM+" -> "Основы" -> "Введение в COM"


michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.
Re[5]: Пробразование объекта в COM объект.
От: michae1  
Дата: 09.07.09 09:08
Оценка:
Здравствуйте, Naigs, Вы писали:

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


N>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.


Сделать это у вас не получиться, потому что сделать это нельзя впринципе Дело в том, что com-объект — это не просто объект реализующий какой-то интерфейс. Любой com-объект имеет вполне определенную структуру, требует регистрации в реестре и т.д. Почитайте статью и вам все станет понятно. Ну и еще, по-моему, такой задачи в процессе разработке возникать недолжно — это явно ошибка в проектировании.
Re[6]: Пробразование объекта в COM объект.
От: Naigs  
Дата: 09.07.09 09:34
Оценка:
Здравствуйте, michae1, Вы писали:

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


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


N>>michae1, Вы меня видимо не правильно поняли, мне нужно преобразовать обычный объект в COM объект во время выполнения программы. Как преобразовать руками это понятно: просто написать интерфйес.


M>Сделать это у вас не получиться, потому что сделать это нельзя впринципе Дело в том, что com-объект — это не просто объект реализующий какой-то интерфейс. Любой com-объект имеет вполне определенную структуру, требует регистрации в реестре и т.д. Почитайте статью и вам все станет понятно. Ну и еще, по-моему, такой задачи в процессе разработке возникать недолжно — это явно ошибка в проектировании.


COM объект можно сделать наследником нашего класса, и он будет зарегистрирован после компиляции.

Вот есть статья там написано как динамически создавать интерфейс и добавлять методы, только вот метод добавления методов на вход получает строки, т.е. имя и параметры в виде строк. То есть, если мой класс сделать наследником этого класса, то интерфейс динамически создать получиться, но не получиться перекинуть методы класса на интерфейс.
Re[7]: Пробразование объекта в COM объект.
От: michae1  
Дата: 09.07.09 12:21
Оценка:
Здравствуйте, 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>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.


Вам стоило-бы более подробно описать ситуацию, уделив максимальное внимание деталям. В общем виде, как это описано у Вас, задача не решаема. Однако её можно решить для некоторого подмножества случаев. Я думаю, в первую очередь Вам следовало-бы осветить следующие моменты


В качестве общих рассуждений — в принципе, интерфейс — всего лишь таблица с адресами функций, реализующих его методы. Нет никаких препятствий для создания такой таблицы вручную, в том числе и в Run-Time. Но определённую сложность представляет организация поддержки такого интерфейса со стороны подсистемы COM.

Так-же на лету можно сгенерировать таблицу соответствия "Имя метода" -> "Адрес функции" + "описание параметров", и использовать её в IDispatch.Invoke.

Также есть возможность сгенерировать "на лету" Type Information и её перепоручить реализацию IDispatch.Invoke.

Однако все эти способы требуют приличных трудозатрат и достаточно хороших знаний в области интерфейсов вообще и их применения в COM в частности. Поэтому Вам стоило бы подробно описать саму задачу целиком. Возможно, существует иной, более "цивилизованный" путь её решения.
Re[2]: Пробразование объекта в COM объект.
От: Аноним  
Дата: 10.07.09 06:23
Оценка:
То есть общий подход может быть таким:
Создаётся некий универсальный COM-объект, который в Run-time по Вашему заказу создаёт и аггрегирует интересующий Вас объект и потом переадресует ему вызова методов интерфейса.
Re: Пробразование объекта в COM объект.
От: algol Россия about:blank
Дата: 10.07.09 13:24
Оценка:
Здравствуйте, 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.
Re: Пробразование объекта в COM объект.
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.07.09 18:11
Оценка:
Здравствуйте, Naigs, Вы писали:

N>Здравствуйте.


N>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект.

N>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
N>Но самое главное, что это нужно сделать "на лету".

N>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.


В C++ (как и AFAIK во многих других языках) задача добавления новых методов к объекту во время исполнения неразрешима.
Т.е. уже созданному объекту во время выполнения программы вообще нельзя "навесть интерфейс" (IUnknown в случае COM), т.е. добавить новые методы (методы этого интерфейса) динамически уже созданному объекту не получится. Это же блин не скриптовый язык

И кстати, в C++ вообще нельзя добавить метод объекту, его можно добавить только классу, т.е. всем объектам этого класса. Т.е. если у нас есть два объекта одного и того же класса, то набор методов (интерфейсов) у них будет одинаковый

В общем все это IMHO означает, что ваш объект должен поддерживать COM-интерфейс IUnknown (ну или IDispatch) изначально (т.е. изначально быть COM-объектом).
Re[2]: Пробразование объекта в COM объект.
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.07.09 18:20
Оценка:
Здравствуйте, bnk, Вы писали:

N>>Нужно решить такую задачу: необходимо преобразовать обычный объект в COM объект.

N>>Фактически, на сколько я понимаю(я мало знаком с COMом),нужно на этот объект навесить COM интерфейс, который содержит методы объекта.
N>>Но самое главное, что это нужно сделать "на лету".

N>>Я не представляю, как это возможно сделать. По возможности, можно по подробнее.


bnk>В C++ (как и AFAIK во многих других языках) задача добавления новых методов к объекту во время исполнения неразрешима.


Упс. Что это я про C++ кстати.
Что у вас за объект-то который нужно преобразовать? Он вообще где? На каком языке написан, в какой среде находится?
Т.е. как ваш COM-объект реализован "физически"? Может там и можно такое сделать.
Re: Пробразование объекта в COM объект.
От: Naigs  
Дата: 12.07.09 04:08
Оценка:
Задача оказалась действительно сложной.

Передо мной поставили новую задачу. Есть С++ объект, создается динамически, нужно написать COM оболочку на JScript.
Так как с JScript я еще не знаком(да и вообще особо не владею скриптовыми языками), возникли следующие вопросы:
1) Как происходит взаимодействие обычного языка(С++) со скриптовым? Конкретно, как используется обин язык в другом.
2) Как на JScrtip создать простейший COM объект?
3) Где можно найти хорошую документацию по JSript (кроме MSDN ?
Re[2]: Пробразование объекта в COM объект.
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.07.09 08:20
Оценка:
Здравствуйте, 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, да вы правы, спасибо за исправление
Re[3]: Пробразование объекта в COM объект.
От: Naigs  
Дата: 12.07.09 10:04
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Может быть все же

bnk>не "Написать на JScript COM-оболочку для объекта написанного на C++",
bnk>а "Написать на C++ COM-оболочку для работы из JScript с объектом, написанным на С++"?

bnk>Вы уточните, а то первая задача AFAIK неразрешима, вторая же является типовой.


Сообщение выше написал я забыл залогиниться.
Re[4]: Пробразование объекта в COM объект.
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.07.09 11:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 объект
Re[3]: Пробразование объекта в COM объект.
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.07.09 18:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И все таки меня интересует вопрос: как на JScrtip создать простейший COM объект


Да, тяжело тебе, наверное (с) Лина Инверс


Может это (создание и использование COM-объекта на jscript)?

FILE: myFile.js
var myObj = new ActiveXObject("MyComLibrary.MyObject");
myObj.SayHello();

Или это (реализация COM-объекта на jscript)?
Хотя все же наверное первое.

FILE: myObj.wsc
<component id="MyId">
<registration progid="MyComLibrary.MyObject"/>
<public>
    <method name="SayHello" />
</public>

<script language="JScript">
function SayHello()
{
    return "Hello world";
}
</script>
</component>

А вообще рекомендую обратиться к тому, кто тебе "поставил задачу".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.