Что простые методы там для обертывания основанной на C++ объектной модели с COM-интерфейсом

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

Что быстрые и эффективные методы там для того, чтобы сделать это. Любой совет, ссылки на практический, "Как к" документации очень ценился бы.

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

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

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

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

Сохраняя его максимально простым, модель Single-Threaded Apartment и незавершенный dll.

6
задан Rich 6 May 2010 в 22:30
поделиться

2 ответа

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

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

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

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

Простите за длинный ответ.

6
ответ дан 16 December 2019 в 21:37
поделиться

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

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

2
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: