Как создать COM DLL в Visual Studio 2008?

прошли века с тех пор, как я написал com dll. Я сделал пару классов, которые наследуются от некоторых COM-интерфейсов, но я хочу проверить это. Я знаю, что мне нужно где-то поместить GUID, а затем зарегистрировать его в regsvr32, но какие шаги?

Edit: Извините, забыл упомянуть, что я использую C++.

3 ответов


чтобы создать новый проект ATL COM, вы можете действовать следующим образом:

  1. Файл/Новый Проект
  2. проект Visual C++/ATL / ATL
  3. Настройка параметров и нажмите кнопку Готово, когда сделано

вы создали новую dll, но она пуста, чтобы добавить COM-объект, вы можете сделать это:

  1. Проект/Добавить Класс
  2. Visual C++/ATL/ATL простой объект, нажмите add
  3. дайте имя, которое вы хотите (например, MyObject), и нажмите закончить, чтобы добавить его

Если вы хотите, чтобы объект реализовал интерфейс

  1. в представлении класса выберите класс объекта (CMyObject)
  2. щелкните правой кнопкой мыши/добавить/реализовать интерфейс...
  3. вы можете выбрать, какой интерфейс будет осуществлять
    1. от an .idl файл уже в ваших проектах files
    2. из .tlb/.файл DLL./exe, которые имеют встроенную библиотеку типов
    3. из объекта уже зарегистрирован
  4. по завершении нажмите finish

PS: гораздо проще создать новый проект ATL с тем же именем в другой папке и добавить файлы, которые вы настроили. Мастер выполняет несколько задач и создает несколько настраиваемых файлов.

для больших проектов, которые трудно добавить файл за файлом, я делаю то же самое, но вместо добавления моих файлов в новый проект я начинаю копировать настройки из новых проектов в старый один и добавление любого дополнительного файла, созданного мастером, и исправление заголовков, таких как stdafx.h для объединения новых настроек.

PPS: если вы хотите, чтобы ваша dll поддерживала MFC, вместо выбора проекта ATL вам нужно выбрать MFC/MFC Dll. При добавлении простого объекта ATL мастер попросит добавить поддержку ATL в проект.


вам нужно написать функцию под названием DllGetClassObject и экспортировать его. Эта функция отвечает за выделение "фабрики классов", которую вы также должны написать, и которая, в свою очередь, способна выделять экземпляры вашего COM-объекта. Он должен реализовать IClassFactory.

это не слишком сложно сделать. Альтернативой является использование ATL (см. ответ xhantt), который теоретически делает это для вас, но на практике это настоящий беспорядок. Как-то это удается инкапсулируйте сложность COM внутри слоя абстракции, который еще сложнее. Удачи в попытке переместить объект между DLL, например.

но вы можете запустить мастер ATL, чтобы увидеть пример того, как объявить DllGetClassObject. Реализация IClassFactory очень легко-только один метод, который новости вверх объект.

затем вам нужно зарегистрировать DLL-т. е. поместить ключи в реестр. The regsvr32 инструмент не может сделать это без дополнительной помощи от вас. Ты должен напишите и экспортируйте другую функцию под названием DllRegisterServer, который делает всю тяжелую работу. Все это regsvr32 делает это загрузка DLL, посмотрите DllRegisterServer и назвать его.

опять же, ATL имеет способ реализации этого для вас, но он делает это, читая своего рода сценарий, полный инструкций по изменению реестра, хранящихся в an .файл rgs, который внедряется в ресурсы вашей DLL. Если вы случайно поместили какую-либо синтаксическую ошибку в этот файл, регистрация завершится неудачно молча.

Итак, опять же, вы можете найти проще написать несколько строк кода, чтобы настроить реестр самостоятельно. вот подробности.

если бы вы использовали C# вместо этого, у вас не было бы ни одной из этих проблем. Все инкапсулировано очень чисто. На самом деле он работает намного лучше, чем C++, как инструмент для разработки COM-объектов.


когда вы создаете решение, оно автоматически регистрирует dll. А также он создает два файла _i.c and .H-файл.

для проверки dll создайте пример приложения:

  1. создать пример приложения Win32. Включая _i.c and .h в файле cpp приложения win32, которое имеет основную функцию

  2. Вызов CoInitialize ();

  3. объявить указатель на интерфейс Ccomptr при помощи pMyInterface = NULL; / / где IMyInterface объявлен в _i.c

  4. создать экземпляр pMyInterface.CoCreateInstance (CLSID_MyClass); // CLSID_MyClass-идентификатор GUID, представляющий
    Кокласс!--1-->

  5. вызовите API, присутствующие в интерфейсе

  6. Вызова CoUnInitialize();