// Не забываем инициализировать COM библиотеку (сколько раз я наступал на эти грабли!!!) CoInitializeEx(NULL, COINIT_MULTITHREADED); // А это наш скрипт. CString script = "k = 10 \r\n" "dim x \r\n" "dim y \r\n" "x = 10 \r\n" "y = 20 \r\n" "VALUE = GetMax(x, y)\r\n" "PrintValue(VALUE)\r\n" "Message \"Hello, Script!\" \r\n";
// Об этих объектах уже столько сказано: CCodeObject codeobj; CScriptHost host;
// Глобальное имя объекта скрипта. Это и есть та строка, которая // (помните?) передается потом как параметр при вызове // CScriptHost::GetItemInfo(LPCOLESTR pstrName, ... ) LPCOLESTR pstrObjectName = L"CodeObject";
// Передадим наш codeobj, вернее, его IDispatch интерфейс. // обьект host его запомнит, а потом, когда будет нужно, передаст в // при вызове CScriptHost::GetItemInfo(), как говорилось ранее. host.AssociateNamedObject( codeobj.GetIDispatch(TRUE), pstrObjectName );
// Создаем (инстанциируем) обьекты ActiveX Scripting Engine для // VBScript. При желании, можно заменить L"VBScript" на L"JScript" для // JavaScript. В документации Microsoft указано, что возможно // использовать также Perl и Lisp, но я не пробовал.
IActiveScript *pASEngine = NULL; IActiveScriptParse *pISParser = NULL;
CLSID EngineClsid; CLSIDFromProgID(L"VBScript", &EngineClsid); CoCreateInstance(EngineClsid, NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, (void **)&pASEngine);
pASEngine->QueryInterface(IID_IActiveScriptParse, (void**)&pISParser);
// Передаем наш хост-объект – как уже говорилось, engine будет вызывать // его методы. pASEngine->SetScriptSite(&host);
// Здесь важен флаг видимости имен SCRIPTITEM_GLOBALMEMBERS. // Если этот флаг не указывать, нужно потом вызывать ParseScriptText с // обязательным pstrObjectName в качестве второго параметра: // pISParser->ParseScriptText( pParseText, // pstrObjectName, // NULL, NULL, 0, 0, 0, NULL, &ei);
pASEngine->AddNamedItem( pstrObjectName, SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE | SCRIPTITEM_GLOBALMEMBERS);
pISParser->InitNew();
// Ну что ж, передаем скрипт для парсинга. EXCEPINFO ei = {0}; BSTR pParseText = script.AllocSysString(); pISParser->ParseScriptText(pParseText, NULL, NULL, NULL, 0, 0, 0, NULL, &ei); SysFreeString(pParseText);
// Всё, пора. Запускаем скрипт на выполнение!!! pASEngine->SetScriptState(SCRIPTSTATE_CONNECTED);
// Ну вот и всё... pASEngine->Close(); pISParser->Release(); pASEngine->Release();
|