Недостаточно построить голый COM-объект.Начнем с того, что это было бы настолько скромно, что с ним не связано ни одно имя.Вы уже обнаружили, что вам также нужна фабрика объектов.
Так что, да, реализуйте DllGetClassObject
.Вам придется проверить входной аргумент rclsid
.Это идентификатор интерфейса.Если вы не узнаете это, верните CLASS_E_CLASSNOTAVAILABLE
.По-видимому, из-за хакерских подходов (вроде предложенного вами безусловного S_OK) Microsoft теперь передает как минимум один неверный идентификатор класса. .Если вы лжете и утверждаете, что можете это сделать, Windows не поверит ничему другому, что вы скажете.
Итак, на какие интерфейсы вы должны претендовать?Очевидно, IUnknown
- это самый корень системы.Самый голый COM-объект больше ничего не делает.Однако вам нужно больше интерфейсов - веб-приложение запрашивает объект ActiveX .Это требует больше интерфейсов.Возможно, самый простой подход - просто посмотреть, что просит Windows.Я подозреваю, что вам понадобится хотя бы IDispatch.
Далее вам нужно будет реализовать несколько методов.«Подождите», вы можете сказать, «они не называются».Ну, IDispatch
- это своего рода мета-интерфейс для языков сценариев.Он используется для перечисления доступных методов.Следовательно, ваш IDispatch
интерфейс также должен поддерживать такое перечисление, даже если он возвращает ноль скриптовых методов.
Там намного больше деталей, но этого уже должно быть достаточно, чтобы помочь убедитьвам использовать ATL и захватить его код ActiveX.Это будет гораздо более полным, чем все, что я могу перечислить здесь.