IActiveScriptSite обрабатывает \\02 как управляющий символ при передаче d в качестве строкового параметра функции при использовании JScript.

Моя проблема заключается в том, что IActiveScriptParse, похоже, ведет себя по-разному в отношении строковых параметров метода, который должен вызываться с помощью автоматизации, в зависимости от того, используется ли VBScript или JScript.

Вызов скрипта в обоих случаях только

app.Search("tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02")

В VBScript параметр будет правильно передан моей функции поиска. В то время как JScript будет рассматривать \02 как управляющий символ, в данном случае STX, и поэтому я не смогу найти правильный элемент управления, который должен был быть найден.

Я создал простой проект MFC с поддержкой автоматизации, следуя https://www.codeproject.com/Articles/8202/Adding-automation-to-MFC-applications , поэтому я добавил класс приложения, который должен реализовать очень простой интерфейс, описанный в холостой ход:

         interface IApplication : IDispatch
   {
      [id(1), helpstring("method Search")] LPDISPATCH Search(LPCTSTR Id);
   };

Сопоставил его с "SearchInternal"

      BEGIN_DISPATCH_MAP(CApplication, CCmdTarget)
    DISP_FUNCTION_ID(CApplication, "Search", dispidSearch, SearchInternal, VT_DISPATCH, VTS_BSTR VTS_VARIANT)
END_DISPATCH_MAP()


LPDISPATCH CApplication::SearchInternal(LPCTSTR Id)
{
    CString title;
    CString output = _T("Passed Id was: \n");
    output.Append(g_strIdBeforeCall);
    output.AppendFormat(_T("\nreceived parameter Id is \n%s"), Id);

    if (g_calledByVBS)
        title = (_T("VBScriptParse"));
    else
        title = (_T("JScriptParse"));

    MessageBox(NULL, output, title, MB_OK);
    return NULL;
}

Теперь я пытаюсь вызвать свой метод через JScript и VBScript, реализуя IActiveScriptSite. В основном, как https://github.com/stephenquan/RunScriptDemo из другого вопроса о стеке.

В целях тестирования вызовы сценариев инициируются нажатием кнопки, но поведение такое же, когда они фактически исходят из удаленного файла .vbs / .jscript.

      void ChildViewButton::runScript()
{
    //get application object
    CApplication* pApp = new CApplication();


    CSimpleScriptSite* pScriptSite = new CSimpleScriptSite();
    pScriptSite->m_pUnkSessionScriptObject = pApp->GetIDispatch(FALSE);       


    // Initialize JScript
    CComPtr<IActiveScript> spJScript;
    CComPtr<IActiveScriptParse> spJScriptParse;
    HRESULT hr = spJScript.CoCreateInstance(OLESTR("JScript"));
    hr = spJScript->SetScriptSite(pScriptSite);
    spJScript->AddNamedItem(L"app", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE | SCRIPTITEM_GLOBALMEMBERS);
    hr = spJScript->QueryInterface(&spJScriptParse);
    hr = spJScriptParse->InitNew();


    //Initialize VBscript
    CComPtr<IActiveScript> spVBScript;
    CComPtr<IActiveScriptParse> spVBScriptParse;
    hr = spVBScript.CoCreateInstance(OLESTR("VBScript"));
    hr = spVBScript->SetScriptSite(pScriptSite);
    spVBScript->AddNamedItem(L"app", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE | SCRIPTITEM_GLOBALMEMBERS);
    hr = spVBScript->QueryInterface(&spVBScriptParse);
    hr = spVBScriptParse->InitNew();



    // Run some scripts
    g_strIdBeforeCall = _T("app.Search(\"tabsTAXI_TABSTRIP_OVERVIEW/tabpT\\02\")");
    _bstr_t strCodeBstr = bstr_t(g_strIdBeforeCall);

    //check CApplication::SearchInternal
    g_calledByVBS = true;
    testScript(L"VBScript", spVBScriptParse, strCodeBstr);
    g_calledByVBS = false;
    testScript(L"JScript", spJScriptParse, strCodeBstr);



    // Cleanup
    spVBScriptParse = NULL;
    spVBScript = NULL;
    spJScriptParse = NULL;
    spJScript = NULL;
    pScriptSite->Release();
    pScriptSite = NULL;
}

С TestScript():

      void testScript(const wchar_t* prefix, IActiveScriptParse* pScriptParse, LPCOLESTR script)
{
    wprintf(L"%s: %s\n", prefix, script);
    HRESULT hr = S_OK;
    CComVariant result;
    EXCEPINFO ei = { };
    hr = pScriptParse->ParseScriptText(script, NULL, NULL, NULL, 0, 0, 0, &result, &ei);
}

Результат:

JScript рассматривает \02 как управляющий символ \x2 == STX. Есть ли у вас какие-либо предложения, если я могу что-то здесь упустить или это ошибка API? К сожалению, мы не можем изменить нашу систему индексации \02, \03, \04... и я также не знаю, как решить эту проблему после того, как я достиг SearchInternal(), поскольку это могло бы произойти при любом количестве вызовов поиска в одном скрипте с разными индексы в том же формате.

0 ответов

Другие вопросы по тегам