Javascript и С/C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ++Norton++, 28 Mar 2010.

  1. ++Norton++

    ++Norton++ Elder - Старейшина

    Joined:
    20 Nov 2006
    Messages:
    167
    Likes Received:
    39
    Reputations:
    0
    Интересует один вопрос, реально ли выполнить кусок javascript кода с помощью С/C++?
    Т.е. к примеру на входе мы читаем файл, в котором есть к примеру:
    Code:
    <script>document.write("test");</script>
    
    На выходе получаем вывод строки: test на экран. И т.п. (разные функции escape() и другие)
    Может есть какая-нибудь библиотека?
    Заранее спасибо!
     
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Я для таких целей юзаю ActiveX компонент ScriptControl
     
    2 people like this.
  3. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    2 people like this.
  4. Interceptor

    Interceptor New Member

    Joined:
    6 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Есть стандартные COM объекты для поддержки скриптов: IActiveScript, IActiveScriptParse, IActiveScriptSite. Смотри описание в мсдн.
    Вот пример кода как это делается.
    Code:
    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, а иначе будут доступны только основные методы языка: математические функции, строки, массивы и т.д.