Я нахожу хорошую коллекцию статей для начинающих в 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-объектов на две части:
- Вы пишете только интерфейс сборка без какой-либо реализации и регистрируете ее.
- Вы разрабатываете классы .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.
Извините за длинный ответ.