Как создать COM DLL в Visual Studio 2008? - PullRequest
8 голосов
/ 21 января 2009

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

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

Ответы [ 3 ]

11 голосов
/ 21 января 2009

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

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

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

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

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

  1. В представлении классов выберите класс объекта (CMyObject)
  2. Правый клик / Добавить / Реализовать интерфейс ...
  3. Вы можете выбрать, какой интерфейс будет реализован
    1. Из файла .idl уже в файлах ваших проектов
    2. Из .tlb / .dll / .exe, в который встроена библиотека типов
    3. с уже зарегистрированного объекта
  4. Когда закончите, нажмите Готово

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

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

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

3 голосов
/ 25 января 2009

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

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

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

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

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

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

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

1 голос
/ 21 января 2009

Когда вы создаете решение, оно автоматически регистрирует DLL. А также создает два файла _i.c и .h file.

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

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

  2. Call CoInitialize ();

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

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

  5. Вызовите API, представленные в интерфейсе

  6. Вызов CoUnInitialize ();

...