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(), поскольку это могло бы произойти при любом количестве вызовов поиска в одном скрипте с разными индексы в том же формате.