Как создать COM DLL в Visual Studio 2008?
прошли века с тех пор, как я написал com dll. Я сделал пару классов, которые наследуются от некоторых COM-интерфейсов, но я хочу проверить это. Я знаю, что мне нужно где-то поместить GUID, а затем зарегистрировать его в regsvr32, но какие шаги?
Edit: Извините, забыл упомянуть, что я использую C++.
3 ответов
чтобы создать новый проект ATL COM, вы можете действовать следующим образом:
- Файл/Новый Проект
- проект Visual C++/ATL / ATL
- Настройка параметров и нажмите кнопку Готово, когда сделано
вы создали новую dll, но она пуста, чтобы добавить COM-объект, вы можете сделать это:
- Проект/Добавить Класс
- Visual C++/ATL/ATL простой объект, нажмите add
- дайте имя, которое вы хотите (например, MyObject), и нажмите закончить, чтобы добавить его
Если вы хотите, чтобы объект реализовал интерфейс
- в представлении класса выберите класс объекта (CMyObject)
- щелкните правой кнопкой мыши/добавить/реализовать интерфейс...
- вы можете выбрать, какой интерфейс будет осуществлять
- от an .idl файл уже в ваших проектах files
- из .tlb/.файл DLL./exe, которые имеют встроенную библиотеку типов
- из объекта уже зарегистрирован
- по завершении нажмите 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 создайте пример приложения:
создать пример приложения Win32. Включая _i.c and .h в файле cpp приложения win32, которое имеет основную функцию
Вызов CoInitialize ();
объявить указатель на интерфейс Ccomptr при помощи pMyInterface = NULL; / / где IMyInterface объявлен в _i.c
создать экземпляр pMyInterface.CoCreateInstance (CLSID_MyClass); // CLSID_MyClass-идентификатор GUID, представляющий
Кокласс!--1-->вызовите API, присутствующие в интерфейсе
Вызова CoUnInitialize();