Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Javascript и С/C++ (https://forum.antichat.xyz/showthread.php?t=190992)

++Norton++ 28.03.2010 01:10

Javascript и С/C++
 
Интересует один вопрос, реально ли выполнить кусок javascript кода с помощью С/C++?
Т.е. к примеру на входе мы читаем файл, в котором есть к примеру:
Код:

<script>document.write("test");</script>
На выходе получаем вывод строки: test на экран. И т.п. (разные функции escape() и другие)
Может есть какая-нибудь библиотека?
Заранее спасибо!

GhostOnline 28.03.2010 01:47

Я для таких целей юзаю ActiveX компонент ScriptControl

scrat 28.03.2010 02:54

внезапно

Interceptor 07.04.2010 18:19

Цитата:

Сообщение от ++Norton++
Интересует один вопрос, реально ли выполнить кусок javascript кода с помощью С/C++?
Т.е. к примеру на входе мы читаем файл, в котором есть к примеру:
Код:

<script>document.write("test");</script>
На выходе получаем вывод строки: test на экран. И т.п. (разные функции escape() и другие)
Может есть какая-нибудь библиотека?
Заранее спасибо!

Есть стандартные COM объекты для поддержки скриптов: IActiveScript, IActiveScriptParse, IActiveScriptSite. Смотри описание в мсдн.
Вот пример кода как это делается.
Код:

HRESULT hr;
CComPtr<IActiveScript> spActiveScript;
CComPtr<IActiveScriptParse> spScriptParse;
CComPtr<IActiveScriptSite> spSite; // must be implemented by host

if( FAILED( hr = CoCreateInstance( clsidEngine, // set clsid of VB or JS engine, depending on input language
    NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, (void**)&spActiveScript ) ) )
    return hr;

if( FAILED( hr = spActiveScript->QueryInterface( IID_IActiveScriptParse, (void**)&spScriptParse ) ) )
    return hr;

if( FAILED( hr = spActiveScript->SetScriptSite( spSite ) ) )
    return hr;

if( FAILED( hr = spScriptParse->InitNew() ) )
    return hr;
// use this to add your own objects into script namespace
if( FAILED( hr = spActiveScript->AddNamedItem( g_lpstrController, SCRIPTITEM_GLOBALMEMBERS|SCRIPTITEM_ISVISIBLE ) ) )
    return hr;

CComBSTR bstrScript; // load from text file

EXCEPINFO ei;
if( SUCCEEDED( hr = spScriptParse->ParseScriptText( bstrScript, NULL, NULL, NULL, 0, 0, 0, NULL, &ei ) ) )
{
    SCRIPTSTATE st;
    if( SUCCEEDED( hr = spActiveScript->GetScriptState( &st ) ) )
    {
        if( st != SCRIPTSTATE_CONNECTED )
        {  // run script
            hr = spActiveScript->SetScriptState( SCRIPTSTATE_CONNECTED );
        }
    }
}
return hr;

Единственно что нужно отметить, для того чтобы получилось обратиться в скрипте document.write() необходимо реализовать объект поддерживающий IDispatch интерфейс реализирующий метод write() и добавить его в пространство имен скрипта под именем "document" (AddNamedItem) что в общем-то и делает IE, а иначе будут доступны только основные методы языка: математические функции, строки, массивы и т.д.


Время: 20:55