ActiveX Scripting Engines: Интерпретация внешнего скрипта в С++
Страница 2. Создаем механизмы ActiveX Scripting



Создаем механизмы ActiveX Scripting

Забежим немного вперед. Предположим, у нас уже есть инстанциированный объект Microsoft ActiveX Scripting. Для простоты, условно обьявим его так:

  СActiveXScriptEngine   engine;

Теперь мы можем вызывать его методы, например:

   engine.InitNew();

Но сам обьект «engine» не может взаимодействовать с нашей программой – он ничего о ней не знает. Реализовать механизм обратной связи можно было по-разному. Например, передать объекту «engine» указатели на функции (callback function).

Механизм обратной связи ActiveX Scripting построен на основе специального интерфейса (класса) IActiveScriptSite. Грубо говоря, существует объявленный базовый интерфейс (класс) IActiveScriptSite, содержащий набор заранее определенных виртуальных функций. Необходимо создать класс, унаследованный от IActiveScriptSite, и перегрузить его виртуальные функции:

class CScriptHost : public IActiveScriptSite
{

virtual HRESULT _stdcall OnEnterScript();
virtual HRESULT _stdcall OnLeaveScript();
    //. . .
};

Теперь нужно создать экземпляр нашего класса CScriptHost и передать обьекту «engine» его адрес:

CScriptHost host;
engine.SetScriptSite(&host);

Совершенно очевидно, что метод SetScriptSite примерно такой:

HRESULT SetScriptSite(IActiveScriptSite *psite)
{
   m_pActiveScriptSite = psite;
   psite->AddRef();
}

Теперь внутри реализации самого ActiveX Scripting возможны вызовы методов через указатель m_pActiveScriptSite на основе механизмов виртуальности и преобразования типов:

m_pActiveScriptSite->OnLeaveScript(); 
//Реально был вызван CScriptHost:: OnLeaveScript();

Отметим, что все методы, обьявленные в IActiveScriptSite, являются чисто виртуальными:

virtual HRESULT STDMETHODCALLTYPE OnEnterScript( void) = 0;

Поэтому придется переопределять их все, иначе нельзя инстанциировать объект, содержащий чисто виртуальные функции. Вдобавок придется позаботится о методах класса IUnknown, от которого унаследован сам IActiveScriptSite (они тоже чисто виртуальные). В результате появляются функции, особо ничего не делающие, например:

HRESULT _stdcall
CScriptHost::GetDocVersionString(BSTR* pbstrVersionString)
{
    return E_NOTIMPL ;
}

HRESULT _stdcall
CScriptHost::OnScriptTerminate(const VARIANT* pvarResult,
 const EXCEPINFO* pexcepinfo)
{
    return S_OK; // successful
}

 
« Предыдущая статья   Следующая статья »