2009-11-16 2 views
2

Я пишу собственный COM/Ole/ActiveX-обертку для языка сценариев. Мне нужны советы для реализации событий/обратного вызова (например, onreadystatechange из объекта Microsoft.XMLHTTP)callback/event management с COM/Ole/ActiveX

Я заметил, что некоторые объекты COM могут вызывать мой пользовательский объект через интерфейс IDispatch. Это единственный способ управлять событиями?

ответ

4

Если вы задаете более общий вопрос о том, как работают COM-события (от любого клиента, а не только от IE, который имеет определенные требования по безопасности и т. Д.), И как выявлять события ваших объектов, тогда есть хорошая CodeProject, Understanding COM Event Handling, в котором содержится множество сведений о том, как работает обработка COM-событий. Плюс образец C++ (который не зависит от ATL или MFC), чтобы проиллюстрировать, как размещать события. Предупреждение: это довольно сложная статья, но если вы сможете ее преодолеть и понять, у вас будет хороший опыт работы COM-событий.

Если вы подробно спрашиваете, как выставлять свои COM-объекты в javascript, чтобы их можно было вызывать из Internet Explorer, то how to create an activex control that fires events to javascript (without using ATL) - хорошее сообщение в блоге, в котором обсуждаются именно то, что вам нужно (как следует из названия) объекты для javascript, включая все специфические для IE объекты.

BTW, если у вас нет веских оснований, я бы предложил использовать ATL для обработки вашей поддержки COM, разоблачения ваших событий и т. Д. Вы можете сделать это в простой, без зависимости C++ (как указано в статье выше), но ATL упрощает работу. Разумной отправной точкой является раздел MSDN ATL Events, но я определенно прочитал бы статью CodeProject сначала для некоторой общей справочной информации перед погружением в материал MSDN.

Отвечая на ваш конкретный вопрос о IDispatch и событиях: событиям не нужно использовать IDispatch, и клиенты могут напрямую разговаривать с вашей реализацией обработчика событий на C++. Но большинство, если вы хотите, чтобы ваши события обрабатывались IE, javascript, VB6 и другими приложениями для автоматизации («automation» - это термин COM для клиентов, использующий только IDispatch для вызова свойств, методов и событий на COM-объектах) , По этой причине большинство приложений, отправляющих сообщения, используют так называемые «двойные интерфейсы», которые (в их реализации на C++) наследуют как от IDispatch, так и от интерфейса пользовательских событий, и в конечном итоге вызывают тот же код под обложками. ATL упрощает сбор такого COM-компонента с двумя интерфейсами.