Какие простые методы существуют, чтобы обернуть объектную модель на основе c ++ COM-интерфейсом - PullRequest
6 голосов
/ 08 апреля 2010

У меня есть существующая объектная модель c ++, которая представляет уровень приложения бизнес-уровня. Я хочу, чтобы можно было представить объектную модель приложениям, написанным на других языках, т.е. vbscript, VB, javascript и т. Д. Я считаю, что лучший способ сделать это - обернуть бизнес-объекты слоем COM.

Какие быстрые и эффективные методы существуют для этого. Буду очень признателен за любые советы, ссылки на практическую документацию «Как».

Поскольку я начинаю награду за это, вот несколько дополнительных рекомендаций для потенциальных охотников за головами: - 1) Я выбрал подход ATL 2) Сейчас я специально ищу ссылки на действительно хорошую документацию «как и быстро» обернуть ранее существующую объектную модель c ++, чтобы сделать ее пригодной для использования на языке сценариев, таких как javascript 3) Что-то с небольшими рабочими примерами, показывающими мне, какой код должен быть добавлен к каким файлам, например, что входит в cpp, idl и hpp / h и т. Д. Это должно включать пример, который я могу скомпилировать и изменить, чтобы лучше понять .

Приложение ..... Дальнейший контекст. Для меня это повторный визит в СОМ примерно через 10 лет. Я делал MFC и ATL COM в течение 3 лет до 2000 года. Я понимаю, что такое COM, принципы, используемые для его реализации в C ++, многопоточные модели и т. Д. Любая документация «как и быстро» не приведет меня вслепую и ослепит важные принципы, больше это будет опыт повторного обучения.

Если бы у меня было больше времени, я бы покопался в «Мастерской разработчика для COM и ATL 3.0» Троелсена, очень хорошая книга, но это очень медленный (повторный) старт.

Дополнительный контекст после комментариев ...........

Сохраняя максимально простую модель однопоточной квартиры и dll в процессе.

Ответы [ 2 ]

6 голосов
/ 03 мая 2010

Я нахожу хорошую коллекцию статей для начинающих в http://www.codeproject.com/KB/COM/index.aspx?#COM/DCOM/COM+%20-%20Beginners. Это:

http://www.codeproject.com/KB/COM/hellocom.aspx, http://www.codeproject.com/KB/COM/comintro2.aspx, http://www.codeproject.com/KB/COM/comintro.aspx, http://www.codeproject.com/KB/COM/com_server_without_mfc_atl.aspx, http://www.codeproject.com/KB/COM/com_in_c1.aspx

Но если вы начинаете программировать объекты COM, очень важно понимать модели потоков COM. Это очень хорошо объяснить здесь

http://www.codeproject.com/KB/COM/CCOMThread.aspx, http://www.codeproject.com/KB/COM/CCOMThread2.aspx

Но я решил ответить вам, потому что хочу предложить немного другой современный способ. Технология COM очень старая. Dot NET имеет все функции внутри и будет постоянно развиваться. Поэтому я считаю наиболее интересным подход из Создание COM-серверов в .NET . Вы пишете свой COM полностью на C #, делите разработку ваших COM-объектов на две части:

  1. Вы пишете только интерфейс сборка без какой-либо реализации и регистрируете ее.
  2. Вы разрабатываете классы .NET, которые реализуют этот интерфейс COM.

Вы можете посмотреть более простую версию в http://www.codeproject.com/KB/COM/COMinDotNet.aspx, http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx, http://msdn.microsoft.com/en-us/library/ms973807.aspx,, но я рекомендую вам способ "Создание COM-серверов в .NET", описанный в http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspx.

ОБНОВЛЕНО после комментария : Извините, но вы ищете простой способ решения сложной проблемы. Это невозможно.

Очень важно понимать, что, несмотря на квази-сходство, существует много принципиальных отличий между объектно-ориентированным C ++ и COM. Важно понимать, что COM - это не объектно-ориентированный язык , а двоичный протокол. Программный компонент (COM-объекты) представляет собой двоичную единицу кода многократного использования . Это решает множество проблем, существующих при раздельной компиляции модулей программ, разработанных на основе объектно-ориентированного подхода.

Если, например, кто-то унаследовал ваши классы, а вы позже изменили некоторые частные члены, это влияет на все унаследованные классы. Полный код, используемый вашими объектами C ++ , должен быть перекомпилирован хотя бы потому, что sizeof(object) был изменен. Такой проблемы не существует в COM, потому что все, кто использует ваши объекты, не наследуют ваши классы объектов. Один использует ваши объекты через интерфейсы , сигнатура и sizeof() не будут изменены после того, как вы измените некоторые закрытые члены ваших базовых классов. Вы можете прочитать некоторые очень хорошие примеры в первой главе классической книги Дона Бокса "Essential COM": http://books.google.co.uk/books?id=kfRWvKSePmAC&dq=essential+com&printsec=frontcover&source=bn&hl=en&sa=X&oi=book_result&resnum=6&ct=result. Я также рекомендую прочитать небольшую статью http://edndoc.esri.com/arcobjects/9.0/ArcGISDevHelp/DevelopmentEnvs/COM/IntroToCOM.htm, чтобы понять больше различий между COM и C ++ объекты.

Если вы переписываете свои объекты C ++ как объекты COM, вам нужно выбрать модель потоков, вы должны понимать, как написать программу, безопасную для потоков, или использовать модель однопотоковых квартир. Все ваши объекты будут существовать (выделены и запущены) в отдельном потоке. Если вы выберете COM-объект Out-Of-Process (будет создан exe-файл со всеми вашими объектами), то будет создан новый процесс. Если кто-то вызывает метод вашего объекта, будет произведено маршалинг всех параметров. Маршалинг параметров означает выделение памяти в другом потоке и копирование всех параметров в поток. Все эти вещи, которые я описал ранее, не являются терминами объектов C ++. Я пишу это только для того, чтобы понять, что COM на самом деле не совпадает с объектной моделью C ++.

Итак, чтобы обернуть ваши существующие объекты C ++, вы должны определить несколько чисто виртуальных классов - интерфейсов , которые вы реализуете в своих объектах. Этот интерфейс должен быть написан на IDL / MIDL ( Язык определения интерфейса Microsoft ). Это самое главное! Затем вы должны реализовать эти интерфейсы как COM coclasses , используя существующие классы C ++.

Я уверен, что если вы выполняете эту работу в .NET, вам не нужно изучать много деталей реализации, которые обычно необходимо знать разработчику COM. Вы просто определяете интерфейс в C # / C ++ (чистый виртуальный класс) и компилируете его. Вы можете сгенерировать закрытый ключ для надежной подписанной сборки внутри Visual Studio. Просто зайдите в настройки проекта в части «Подписание» и выберите «Подписать сборку», затем выберите «Новый» файл ключа строгого имени. Это все. Таким образом вы полностью определяете интерфейс COM. MIDL-версия интерфейса будет создана для вас.

Затем вы создаете новый проект на C # или C ++ и объявляете классы, которые наследуют интерфейс, который вы определили ранее. Во время реализации этого интерфейса вы можете использовать весь существующий объект C ++. Так вы сможете быстро обогатить свои цели. Просто следуйте пути, подробно описанному в http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspx. . Таким образом, вам не придется изучать много технических деталей, которые вы должны знать для классической реализации COM в C ++ . И вы будете изучать современный .NET вместо изучения старого и де-факто мертвого (или не развитого) COM.

Извините за длинный ответ.

2 голосов
/ 08 апреля 2010

http://www.lambdasoft.dk/Comet/index.htm

Comet - это языковая привязка между COM и C ++. Это позволяет вам программировать как COM-клиент, так и COM-сервер, без какой-либо зависимости от ATL или MFC. Другими словами, комета является заменой ATL.

...