Вам нужно написать функцию с именем DllGetClassObject и экспортировать ее. Эта функция отвечает за выделение «фабрики классов», которую вы также должны написать и которая, в свою очередь, способна распределять экземпляры вашего COM-объекта. Он должен реализовать IClassFactory .
Это не так уж сложно сделать. Альтернативой является использование ATL (см. Ответ xhantt), который теоретически делает это за вас, но на практике это настоящий беспорядок. Каким-то образом ему удается инкапсулировать сложность COM внутри уровня абстракции, который является еще более сложным. Удачи в попытке переместить объект между DLL, например.
Но вы можете запустить мастер ATL, чтобы увидеть пример того, как объявить DllGetClassObject
. Реализовать IClassFactory
очень просто - всего лишь один метод, который обновляет объект.
Затем вам нужно зарегистрировать свою DLL - т.е. поместить ключи в реестр. Инструмент regsvr32
не может сделать это без дополнительной помощи от вас. Вы должны написать и экспортировать другую функцию с именем DllRegisterServer , которая выполняет всю тяжелую работу. Все, что делает regsvr32
, это загружает DLL, ищет DllRegisterServer
и вызывает ее.
Опять же, у ATL есть способ реализовать это для вас, но он делает это, читая своего рода скрипт, полный инструкций по модификации реестра, хранящихся в файле .rgs, который внедряется в ресурсы вашей DLL. Если вы случайно поместили какую-либо синтаксическую ошибку в этот файл, регистрация завершится неудачно.
Итак, опять же, вам может оказаться проще написать несколько строк кода, чтобы настроить реестр самостоятельно. Вот подробности .
Если бы вы использовали вместо этого C #, у вас не возникло бы ни одной из этих проблем. Все заключено в капсулу очень чисто. На самом деле он работает намного лучше, чем C ++, как инструмент для разработки COM-объектов.