Реализация моделей поведения динамического HTML с помощью двоичного кода

Модели поведения динамического HTML (DHTML) могут быть реализованы с помощью сценариев, а также языков программирования, например C++. В этой статье описывается двоичные версии моделей поведения, а также приведены шаги, требуемые для создания моделей поведения с помощью Microsoft Visual C++ версии 5, библиотеки шаблонных классов ATL версии 5 и ATL с пакетом обновления 3 (SP3).

Дополнительные сведения о моделях поведения динамического HTML, а также концепциях и преимуществах их использования см. в разделе Связанные разделы.

В этой статье содержатся следующие разделы:

Возможности реализации моделей поведения. Компоненты библиотеки шаблонных классов ATL/COM и HTML 

Поскольку компонент HTML (HTC) может использоваться в качестве средства для создания повторно используемых компонентов с помощью языков сценариев, модели поведения на основе двоичного кода можно использовать для обеспечения лучшей защиты интеллектуальной собственности. Это связано с тем, что в отличие от компонента HTML, модель поведения скомпилирована, а значит ее код нельзя прочитать с помощью команды "Просмотр HTML-кода" в браузере. Кроме того, в отличие от компонентов HTML, модели поведения на основе двоичного кода не используют интерфейсы обработчика сценариев. Вместо этого они напрямую вызывают операционную систему, благодаря чему обеспечивается лучшая производительность по сравнению с компонентами HTML.

В качестве средств реализации моделей поведения на основе двоичного кода Windows Internet Explorer предоставляет интерфейсы C++. В помощью интерфейсов C++ COM-объект может получать уведомления, предоставлять пользовательские события и получать доступ к объектной модели DHTML.

Веб-разработчик может создавать модели поведения на основе двоичного кода с помощью интерфейсов C++ и технологий библиотеки шаблонных классов ATL и модели COM. Это позволяет расширить функциональные возможности HTML-страниц, не нарушая при этом права на интеллектуальную собственность. Администраторы интрасетей также могут воспользоваться преимуществами производительности моделей поведения на основе двоичного кода. Например, администраторы могут создавать модели поведения на основе двоичного кода для реализации административных предписаний на уровне предприятия, уникальных бизнес-правил и гибких технологий управления пользователями в интрасетях.

Предварительные требования и зависимости

Для выполнения инструкций этого раздела потребуются следующие знания и навыки:

Дополнительные сведения о Visual C++ 5.0, библиотеке ATL и общих концепциях см. в разделеСвязанные разделы.

Примечание.  Для выполнения инструкций этой статьи необходимо установить пакет обновления 3 (SP3) для Visual C++ 5.0.

Практическое руководство. Создание проекта модели поведения C++ в Visual C++ 5.0

В этом подразделе приведены инструкции по созданию компонента модели поведения на основе двоичного кода на примере реализации эффекта наведения указателя мыши.

  1. Создание схемы рабочей области ATL/COM.

    В меню "Файл" среды разработки Visual C++ 5.0 выберите команду "Создать" и затем в открывшемся диалоговом окне откройте вкладку "Рабочие области".

    В текстовом поле "Имя рабочей области" введите имя двоичного компонента (в диалоговом окне, показанном на рисунке ниже, в качестве имени рабочей области введено AtlBehave). Нажмите кнопку "ОК", чтобы продолжить.

    В одном файле проекта можно определить несколько объектов модели поведения.

  2. Создание проекта ATL/COM в новой рабочей области.

    Следующий шаг — создание проекта ATL с помощью мастера приложений ATL COM.

    В меню "Файл" среды разработки Visual C++ 5.0 выберите команду "Создать" и затем в открывшемся диалоговом окне откройте вкладку "Проекты".

    В текстовом поле "Имя рабочей области" введите имя двоичного компонента (в диалоговом окне, показанном на рисунке ниже, в качестве имени проекта введено AtlBehave). Затем установите флажок "Добавить в текущую рабочую область" и нажмите кнопку "ОК", чтобы продолжить.

    Код, созданный мастером приложений ATL COM, это не более чем оболочка библиотеки DLL с возможностью регистрации объектов, которые будут определены позднее. Сама по себе оболочка не является объектом модели поведений. Оболочка — это контейнер для множества компонентов. Компоненты совместно используют код, доступный в оболочке. Кроме того, компоненты могут совместно использовать функциональные возможности, поскольку они находятся в одной и той же библиотеке DLL.

    Мастер приложений ATL COM автоматически создает следующие файлы:

    • AtlBehave.cpp. Этот файл содержит код проекта, включая код для фабрики класса, регистрации и DllMain.
    • AtlBehave.def. Это файл определения, который указывает компилятору процедуру, которую необходимо экспортировать (фабрика класса и функции регистрации экспортированы).
    • AtlBehave.idl. Это файл определения интерфейса. Мастер приложений ATL COM не будет реализовывать ни один интерфейс с помощью IDL-файла до тех пор, пока не будут добавлены объекты.
    • AtlBehave.rc. Это DLL-файл ресурсов.
    • StdAfx.cpp и StdAfx.h. Это предварительно скомпилированные файлы заголовков.
  3. Задание переменных среды для среды разработки Visual C++.

    В меню "Сервис" среды разработки Visual C++ 5.0 выберите команду "Параметры" и затем в открывшемся диалоговом окне откройте вкладку "Каталоги". В раскрывающемся списке выберите "Включаемые файлы". Чтобы добавить новый каталог с включаемыми файлами, нажмите кнопку "Создать". Нажмите кнопку "Обзор" и затем выберите каталог, содержащий последние включаемые файлы заголовков Internet Explorer.

    Аналогичным образом помимо пути к библиотеке проекта необходимо добавить путь к библиотекам Internet Explorer. В меню "Сервис" выберите пункт "Параметры" и затем в открывшемся диалоговом окне выберите вкладку "Каталоги". В раскрывающемся списке выберите "Файлы библиотек". Чтобы добавить новый каталог библиотеки, нажмите кнопку "Создать". Нажмите кнопку "Обзор" и затем выберите каталог, содержащий последние включаемые файлы библиотек Internet Explorer.

    Примечание.  Файлы библиотек и включаемые файлы доступны после установки пакета средств разработки программного обеспечения (SDK) Internet Explorer. Новая библиотека и включаемые пути должны быть расположены первыми в списке.

    Дополнительные сведения о настройке среды разработки Microsoft Visual Studio 6.0 см. в разделе Связанные разделы.

  4. Добавление объекта модели поведения.

    После завершения создания проекта модели поведения C++ в Microsoft Visual Studio запустите мастер объектов ATL, чтобы добавить в проект объект модели поведения.

    Для этого в меню "Вставка" выберите команду "Создать объект ATL". Откроется диалоговое окно мастера объектов ATL. В списке слева выберите строку "Объекты". В списке справа щелкните значок "Объект Internet Explorer".

    Нажмите кнопку "Далее". Откроется диалоговое окно "Свойства мастера объектов ATL", показанное на рисунке ниже.

  5. В текстовом поле "Краткое имя" введите имя компонента. В этом примере компонент называется AtlBehav. (Буква "e" была пропущена из-за ограничения на длину краткого имени в 8 символов.)
  6. В текстовом поле "Программный идентификатор" выделите первую часть программного идентификатора и замените ее на AtlBehave.

    Примечание.  Будьте осторожны при изменении значения в текстовом поле "Программный идентификатор". Поскольку мастер не поддерживает ввод точки в этом текстовом поле, постарайтесь не выделять точку, которая отделяет две части программного идентификатора. При удалении точки потребуется повторно запустить мастер.

  7. В текстовом поле "Тип" укажите класс AtlBehave, чтобы при тестировании компонента из контейнера для проверки элементов Microsoft ActiveX можно было быстро найти его. Контейнер для проверки элементов ActiveX — это средство, которое устанавливается вместе с Visual C++ Visual Studio 97. Контейнер загружает COM-объекты и позволяет проверить их с помощью методов и свойств.
  8. Чтобы создать объект, нажмите кнопку "ОК".

Для демонстрации реализации файлов AtlBehave.idl и AtlBehave.cpp мастер объектов ATL создает код, показанный в следующем примере.

AtlBehave.idl

// AtlBehave.idl : Источник IDL для AtlBehave.dll

//

// Этот файл будет обработан с помощью инструмента MIDL

// для создания библиотеки типов (AtlBehave.tlb) и маршалирования кода.

import "oaidl.idl";

import "ocidl.idl";

    [

        uuid(140D550C-2290-11D2-AF61-00A0C9C9E6C5),

        helpstring("IFactory Interface"),

        pointer_default(unique)

    ]

    interface IFactory : IUnknown

    {

    };

    [

        uuid(140D550E-2290-11D2-AF61-00A0C9C9E6C5),

        helpstring("IBehavior Interface"),

        pointer_default(unique)

    ]

    interface IBehavior : IDispatch

    {

    };

    [

        object,

        uuid(5B3517FB-306F-11D2-AF62-00A0C9C9E6C5),

        dual,

        helpstring("IEventSink Interface"),

        pointer_default(unique)

    ]

    interface IEventSink : IDispatch

    {

    };

[

    uuid(140D54FF-2290-11D2-AF61-00A0C9C9E6C5),

    version(1.0),

    helpstring("AtlBehave 1.0 Type Library")

]

library ATLBEHAVELib

{

    importlib("stdole32.tlb");

    importlib("stdole2.tlb");

    [

             uuid(140D550D-2290-11D2-AF61-00A0C9C9E6C5),

             helpstring("Factory Class")

    ]

    coclass Factory

    {

    [default] interface IFactory;

    };

    [

        uuid(140D550F-2290-11D2-AF61-00A0C9C9E6C5),

        helpstring("Behavior Class")

    ]

    coclass Behavior

    {

        [default] interface IBehavior;

    };

    [

        uuid(5B3517FC-306F-11D2-AF62-00A0C9C9E6C5),

        helpstring("EventSink Class")

    ]

    coclass EventSink

    {

        [default] interface IEventSink;

    };

};

AtlBehave.cpp

// AtlBehave.cpp. Реализация экспорта библиотек DLL.

// Примечание. Сведения для прокси-сервера и заглушки кода

#include "stdafx.h"

#include "resource.h"

#include "AtlBehave.h"

#include "AtlBehave_i.c"

#include "Factory.h"

#include "Behavior.h"

#include "EventSink.h"

CComModule _Module;

BEGIN_OBJECT_MAP(ObjectMap)

         OBJECT_ENTRY(CLSID_Factory, CFactory)

         OBJECT_ENTRY(CLSID_Behavior, CBehavior)

         OBJECT_ENTRY(CLSID_EventSink, CEventSink)

END_OBJECT_MAP()

/////////////////////////////////////////////////////////////////////////////

// Точка входа библиотеки DLL

extern "C"

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason,

     LPVOID /*lpReserved*/)

{

         if (dwReason == DLL_PROCESS_ATTACH)

         {

                 _Module.Init(ObjectMap, hInstance);

                 DisableThreadLibraryCalls(hInstance);

         }

         else if (dwReason == DLL_PROCESS_DETACH)

                 _Module.Term();

         return TRUE;    // ok

}

/////////////////////////////////////////////////////////////////////////////

// Используется для определения, может ли OLE выгрузить библиотеку DLL

STDAPI DllCanUnloadNow(void)

{

         return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;

}

/////////////////////////////////////////////////////////////////////////////

// Возвращает фабрику класса для создания объекта запрошенного типа

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)

{

         return _Module.GetClassObject(rclsid, riid, ppv);

}

/////////////////////////////////////////////////////////////////////////////

// DllRegisterServer добавляет записи в системный реестр

STDAPI DllRegisterServer(void)

{

         // регистрирует объект, библиотеку типов и все интерфейсы в библиотеке типов

         return _Module.RegisterServer(TRUE);

}

/////////////////////////////////////////////////////////////////////////////

// DllUnregisterServer удаляет записи из системного реестра

STDAPI DllUnregisterServer(void)

{

         _Module.UnregisterServer();

         return S_OK;

}

Реализация интерфейса IElementBehavior

После создания основного проекта библиотеки шаблонных классов ATL можно продолжить реализацию интерфейса модели поведения на основе двоичного кода. На данном этапе потребуются некоторые интерфейсы. Эти интерфейсы описаны ниже, начиная с интерфейса IElementBehavior.

Интерфейс IElementBehavior используется MSHTML для предоставления уведомлений о состоянии, относящихся к модели поведения динамического HTML и документу, к которому он был присоединен. Для получения интерфейса MSHTML вызывает метод IElementBehaviorFactory::FindBehavior.

В коде необходимо проверить требуемые уведомления. Идентификаторы уведомлений, например BEHAVIOREVENT_DOCUMENTREADY, определены в файле Mshtml.h. Дополнительные идентификаторы, например DIID_HTMLElementEvents, также определены в файле Mshtml.h.

Методы IElementBehavior перечислены в следующей таблице.

Detach Уведомлен до выгрузки контента документа.
Init Уведомлен с помощью интерфейса IElementBehaviorSite сразу после получения интерфейса IElementBehavior из метода IElementBehaviorFactory::FindBehavior.
Notify Уведомлен с помощью сведений о разборе документа и компоненте модели поведения.

Мастер объектов ATL создает следующий пример кода и файлы для демонстрации реализации методов IElementBehavior::Notify, IElementBehavior::Init и IElementBehavior::Detach.

Реализация метода CBehavior::Notify

STDMETHODIMP CBehavior::Notify(

         DWORD event,

         VARIANT* pVar)

{

HRESULT hr=S_OK;

CComPtr  spElem;

         switch ( event )

         {

         case BEHAVIOREVENT_CONTENTCHANGE: 

         // Закрывающий тег элемента проанализирован (можно получить атрибуты)

                 break;

         case BEHAVIOREVENT_DOCUMENTREADY: 

         // Документ HTMLпроанализирован (доступен с помощью модели DOM)

                 if ( m_spSite )

                 {

                          hr = m_spSite->GetElement( &m_spElem );

                          if ( SUCCEEDED(hr) )

                          {

                                   // Создание и подключение журнала событий

                                   hr = CComObject::CreateInstance( &m_pEventSink );

                                   if ( SUCCEEDED(hr) )

                                   {

                                   CComPtr  spStyle;

                                   HRESULT hr;

                                            hr = m_spElem->get_style( &spStyle );

                                            if ( SUCCEEDED(hr) )

                                            {

                                              spStyle->get_color( &m_varColor );

                                              spStyle->get_backgroundColor( &m_varBackColor );

                                           }

                                            m_pEventSink->m_pBehavior = this;

                                            hr = AtlAdvise( m_spElem, m_pEventSink,

                                                     DIID_HTMLElementEvents,

                                                     &m_dwCookie );

                                   }

                          }

                 }

         default:

                 break;

         }

         return S_OK;

}

Реализация метода CBehavior::Init

// Behavior.cpp. Реализация CBehavior

#include "stdafx.h"

#include "AtlBehave.h"

#include "EventSink.h"

#include "Behavior.h"

STDMETHODIMP CBehavior::Init(IElementBehaviorSite* pBehaviorSite)

{

HRESULT  hr;

ATLTRACE("IElementBehavior::Init()\n");

// Кэширование указателя на интерфейс IElementBehaviorSite

m_pSite = pBehaviorSite;

_ASSERTE(m_pSite);

// Получение указателя на интерфейс IElementBehaviorSiteOM

hr = m_pSite->QueryInterface( IID_IElementBehaviorSiteOM, (void**)&m_pOMSite );

_ASSERTE(m_pOMSite);

return S_OK;

}

Реализация метода CBehavior::Detach

// Behavior.cpp. Реализация CBehavior

#include "stdafx.h"

#include "AtlBehave.h"

#include "EventSink.h"

#include "Behavior.h"

/////////////////////////////////////////////////////////////////////////////

// CBehavior

#define DISPID_BKCOLOR 1

#define DISPID_TEXTCOLOR 2

char* CBehavior::m_szMethodNames[] = {"backColor","textColor",NULL};

DISPID CBehavior::m_dispidMethodIDs[] = {DISPID_BKCOLOR,DISPID_TEXTCOLOR,-1};

// Реализация IElementBehavior

STDMETHODIMP CBehavior::Detach(    void)

{

         // Освобождение кэшированных указателей на интерфейсы

         m_pEventSink->Release();

         m_spElem.Release();

         m_spOMSite.Release();

         return S_OK;

}

Реализация интерфейса IElementBehaviorFactory

Интерфейс IElementBehaviorFactory предоставляет реализации модели поведения динамического HTML компоненту MSHTML Microsoft Internet Explorer 5. Если при анализе документа Internet Explorer 5 находит модель поведения, присоединенную к элементу, компонент Mshtml.dll веб-браузера Internet Explorer пытается найти реализацию этой модели поведения и создать ее экземпляр. Компонент MSHTML вызывает IServiceProvider::QueryService приложения. Чтобы найти интерфейс IElementBehaviorFactory, этот вызов использует уникальный идентификатор SID_SHTMLElementBehaviorFactory.

После обнаружения этого интерфейса вызывается метод IElementBehaviorFactory::FindBehavior для создания экземпляра интерфейса IElementBehavior. Метод IElementBehaviorFactory::FindBehavior также предоставляет интерфейс IUnknown. Затем метод IElementBehaviorSite::GetElement извлекает элемент, к которому привязана модель поведения. Если не удается найти интерфейс IElementBehaviorFactory в ведущем приложении, Mshtml.dll проверяет все HTML-теги object, которые могут указывать на компонент модели поведения динамического HTML.

Если MSHTML определяет, что тег object на веб-странице реализует модель поведения, вызывается методIElementNamespaceFactory::Create, который позволяет модели поведения добавить все теги в пространство имен. MSHTML распознает все теги object, которые реализуют модель поведения. Следовательно, если MSHTML обнаруживает пользовательский элемент, он может определить, какой тег object указывает на его реализацию.

Примечание.   В качестве альтернативного варианта ведущее приложение C++ может использовать QueryInterface для извлечения интерфейса IElementBehaviorSite, как показано в примере кода ниже.

// Factory.cpp. Реализация CFactory

#include "stdafx.h"

#include "AtlBehave.h"

#include "Factory.h"

/////////////////////////////////////////////////////////////////////////////

// CFactory

STDMETHODIMP CFactory::FindBehavior(

    BSTR bstrBehavior,

    BSTR bstrBehaviorUrl,

    IElementBehaviorSite* pSite,

    IElementBehavior** ppBehavior)

{

HRESULT  hr;

CComObject*      pBehavior;

         // Создание объекта модели поведения

         hr = CComObject::CreateInstance( &pBehavior );

         if ( SUCCEEDED(hr) )

                 return pBehavior->QueryInterface( __uuidof(IElementBehavior),

                     (void**)ppBehavior );

         else

                 return hr;

}

Предоставление событий, свойств и методов

При использовании интерфейсов модели поведения C++ можно предоставлять свойства и методы.

Например, чтобы создать журнал событий, можно использовать метод Invoke компонента, а затем указать среде интересующий тип уведомления веб-браузера, как показано в следующем примере кода.

// Создание и подключение журнала событий

hr = CComObject<CEVENTSINK>::CreateInstance( &m_pEventSink );

m_pEventSink->m_pElem = pElem;    

hr = AtlAdvise( pElem, m_pEventSink, DIID_HTMLElementEvents, &m_dwCookie );

После получения события вызывается метод CEventSink::Invoke. Если это событие входит в список ожидаемых, для доступа к элементу страницы можно использовать указатель элемента m_pElem и затем изменить свойства элемента страницы с помощью m_pElem->get_style указателя IHTMLStyle.

// EventSink.cpp. Реализация CEventSink

#include "stdafx.h"

#include "AtlBehave.h"

#include "Behavior.h"

#include "EventSink.h"

/////////////////////////////////////////////////////////////////////////////

// CEventSink

STDMETHODIMP CEventSink::Invoke(

    DISPID dispidMember,

    REFIID riid,

    LCID lcid,

    WORD wFlags,

    DISPPARAMS* pdispparams,

    VARIANT* pvarResult,

    EXCEPINFO* pexcepinfo,

    UINT* puArgErr)

{

    switch ( dispidMember )

    {

    case DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER:

                   OnMouseOver();

            break;

    case DISPID_HTMLELEMENTEVENTS_ONMOUSEOUT:

                   OnMouseOut();

            break;

    default:

            break;

    }

    return S_OK;

}

// Обработчики событий

void CEventSink::OnMouseOver()

{

    if ( m_pBehavior )

           m_pBehavior->ShowBehavior();

}

void CEventSink::OnMouseOut()

{

    if ( m_pBehavior )

           m_pBehavior->Restore();

}

Примечание.  Чтобы переопределить модель поведения по умолчанию, необходимо предоставить свойство или метод, имеющий такое же имя, как у свойства или метода, заданного ранее для элемента.

Безопасность объекта в интерфейсе IObjectSafety 

Интерфейс IObjectSafety должен быть реализован объектами, у которых есть интерфейсы, поддерживающие недоверенных клиентов (например, сценарии). Благодаря этому собственник объекта может указать, какой интерфейс требуется защитить от ненадлежащего использования.

Подписывание кода позволяет гарантировать, что код является доверенным. Однако предоставление доступа к элементам управления ActiveX из сценариев приводит к возникновению новых проблем безопасности. Даже в тех случаях, когда известно, что элемент управления является безопасным для пользователя, элемент управления может стать небезопасным, если он используется недоверенным сценарием. Например, приложение Microsoft Word является доверенным средством от надежного источника, однако вредоносный сценарий может использовать его модель автоматизации для удаления файлов на компьютере пользователя и установки макровирусов.

Существует два метода, позволяющих указать, что созданный элемент управления является безопасным для инициализации, и два метода идентификации элемента управления в качестве безопасного для использования в сценариях. Для создания соответствующих записей в системном реестре (после загрузки элемента управления) первый метод использует диспетчер категорий компонентов. Чтобы определить расположение этих записей, перед загрузкой элемента управления веб-браузер Internet Explorer проверяет параметры реестра. Второй метод реализует интерфейс IObjectSafety в элементе управления. Если Internet Explorer определяет, что элемент управления поддерживает интерфейс IObjectSafety, то чтобы определить, является ли он безопасным для использования в сценариях, Internet Explorer вызывает метод IObjectSafety::SetInterfaceSafetyOptions перед загрузкой элемента управления.

Дополнительные сведения об использовании диспетчера категорий компонентов для идентификации элемента управления в качестве безопасного для сценариев см. в разделе Использование диспетчера категорий компонентов. Дополнительные сведения об использовании интерфейса IObjectSafety для идентификации элемента управления в качестве безопасного для сценариев см. в разделе Поддержка интерфейса IObjectSafety.

Интерфейс IObjectSafety позволяет контейнеру запрашивать безопасную версию элемента управления либо извлекать текущую инициализацию или возможности использования элемента управления в сценариях. Этот интерфейс определен в файле Objsafe.h. В настоящее время поддерживаются две возможности: безопасно для инициализации и безопасно для сценариев. Эти возможности соответствуют следующим битовым флагам, которые определены в файле Objsafe.h.

INTERFACESAFE_FOR_UNTRUSTED_DATA Указывает, что интерфейс является безопасным для инициализации.
INTERFACESAFE_FOR_UNTRUSTED_CALLER Указывает, что интерфейс является безопасным для сценариев.

Обработчики сценариев должны поддерживать расширения для запуска в Internet Explorer. Элементы управления должны реализовать эти расширения только в том случае, если требуется полная поддержка модели безопасности Internet Explorer.

Практический пример. Создание модели поведения на основе двоичного кода на примере реализации эффекта наведения указателя мыши

В следующем примере кода реализован эффект наведения указателя мыши на текстовое поле. При наведении указателя мыши цвет текста изменяется на синий. Обратите внимание, как изменяется цвет текста при наведении указателя мыши.

if ( dispidMember == DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER )

{

    IHTMLStyle*  pStyle = NULL;

    HRESULT   hr;

    hr = m_pElem->get_style(&pStyle );

    if (SUCCEEDED(hr))

    {

        DWORD   color;

        pStyle->get_color( &varColor);

        pStyle->get_backgroundColor( &varBackColor );

        color =  GetSysColor( COLOR_HIGHLIGHTTEXT );

        pStyle->put_color( CComVariant("red") );

        color =  GetSysColor( COLOR_HIGHLIGHT );

        pStyle->put_backgroundColor( CComVariant("blue") );

        }

}

else if ( dispidMember == DISPID_HTMLELEMENTEVENTS_ONMOUSEOUT )

{

    IHTMLStyle*  pStyle = NULL;

    HRESULT  hr;

    hr=  m_pElem->get_style(&pStyle );

    if ( SUCCEEDED(hr))

    {

        pStyle->put_color( varColor );

        pStyle->put_backgroundColor( varBackColor );

}

В файле Mshtmdid.h также определены DISPID для диспетчерских интерфейсов событий MSHTML.

Связанные разделы

Более подробные сведения о моделях поведения динамического HTML см. в следующих статьях:

Более подробные сведения о среде разработки Visual Studio см. в следующей статье:

Более подробные сведения о модели COM см. в следующих статьях и книгах:

  • Спецификация модели COM
  • Inside OLE, 2-е издание, Крэйг Брокшмидт (Kraig Brockschmidt) (Microsoft Press)
  • Understanding ActiveX and OLE, Дэвид Чеппелл (David Chappell) (Microsoft Press)
  • Основы COM, Дейл Роджерсон (Dale Rogerson) (Microsoft Press)
  • Основы Visual C++, Дэвид Круглински (David Kruglinski) (Microsoft Press)
  • Professional DCOM Programming, Ричард Граймс (Richard Grimes) (Wrox Press)