Реализация простого COM-объекта - PullRequest
2 голосов
/ 17 ноября 2010

Мне нужно реализовать простой COM-объект на прямом C ++ (без ATL), который используется устаревшим веб-приложением для проверки того, что мое приложение существует. Веб-приложение делает что-то вроде этого (JavaScript):

var object = new ActiveXObject("My.Application");

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

Очевидно, что мне нужно убедиться, что мой объект зарегистрирован, добавив необходимые параметры реестра и т. Д. Мое приложение представляет собой DLL, поэтому я думаю, что мне также нужно реализовать несколько экспортируемых функций (DllRegisterServer, DllUnregisterServer, DllCanUnloadNow и, один это должно что-то, DllGetClassObject).

Я почти уверен, что простой возврат S_OK из DllGetClassObject не обрезает его.

Как я могу реализовать базовый интерфейс без использования ATL? Я использую компилятор MS, если это поможет.

Ответы [ 2 ]

3 голосов
/ 17 ноября 2010

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

Так что, да, реализуйте DllGetClassObject.Вам придется проверить входной аргумент rclsid.Это идентификатор интерфейса.Если вы не узнаете это, верните CLASS_E_CLASSNOTAVAILABLE.По-видимому, из-за хакерских подходов (вроде предложенного вами безусловного S_OK) Microsoft теперь передает как минимум один неверный идентификатор класса. .Если вы лжете и утверждаете, что можете это сделать, Windows не поверит ничему другому, что вы скажете.

Итак, на какие интерфейсы вы должны претендовать?Очевидно, IUnknown - это самый корень системы.Самый голый COM-объект больше ничего не делает.Однако вам нужно больше интерфейсов - веб-приложение запрашивает объект ActiveX .Это требует больше интерфейсов.Возможно, самый простой подход - просто посмотреть, что просит Windows.Я подозреваю, что вам понадобится хотя бы IDispatch.

Далее вам нужно будет реализовать несколько методов.«Подождите», вы можете сказать, «они не называются».Ну, IDispatch - это своего рода мета-интерфейс для языков сценариев.Он используется для перечисления доступных методов.Следовательно, ваш IDispatch интерфейс также должен поддерживать такое перечисление, даже если он возвращает ноль скриптовых методов.

Там намного больше деталей, но этого уже должно быть достаточно, чтобы помочь убедитьвам использовать ATL и захватить его код ActiveX.Это будет гораздо более полным, чем все, что я могу перечислить здесь.

1 голос
/ 17 ноября 2010

В COM-сервере, поддерживающем позднюю привязку из Javascript, работающего внутри IE, существует ничто . Если вы не знаете, как реализовать DllGetClassObject (), вам нужна вся помощь, которую вы можете получить. Вы получаете большую помощь от ATL и мастеров, встроенных в Visual Studio. Подавляющее большинство неуклюжего сантехнического кода генерируется автоматически, включая эти 4 экспорта. И IDispatch, интерфейс, который необходим Javascript.

Запустите проект с помощью шаблона проекта ATL + ATL. Значения по умолчанию хорошие. Щелкните правой кнопкой мыши проект, Add, Class и выберите ATL + ATL Simple Object. Переключитесь в режим просмотра классов, найдите тип интерфейса и щелкните его правой кнопкой мыши, чтобы добавить методы и свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...