Я использую внешнее приложение C ++ для управления Internet Explorer (версия 11, но для этого примера это неважно).Частью этого элемента управления является возможность запуска произвольного JavaScript в контексте браузера.Чтобы включить этот элемент управления, я хотел бы иметь возможность создавать объект JavaScript (или массив, или функцию и т. Д.), Представленный соответствующим вариантом IDispatch
, который я могу использовать в последующих вызовах сценария.Есть несколько примеров в сети , включая некоторые от Microsoft , которые указали бы на то, что должна быть возможной, найдя и вызвав конструктор Object.
Ниже приведен пример кода, взятый из вышеупомянутых примеров, который должен сделать свое дело.Однако когда я выполняю код, я получаю E_INVALIDARG («Один или несколько аргументов недействительны»), возвращается HRESULT.Что я делаю не так, и как мне исправить проблему?
// Example assumes that you're using an ATL project which give access to
// the "CCom" wrapper classes, and that you have the ability to retrieve
// an IHTMLDocument2 object pointer.
int CreateJavaScriptObject(IHTMLDocument2* script_engine_host, CComVariant* created_object) {
// NOTE: Proper return code checking and error handling
// has been omitted for brevity
int status_code = 0;
CComPtr<IDispatch> script_dispatch;
HRESULT hr = script_engine_host->get_Script(&script_dispatch);
CComPtr<IDispatchEx> script_engine;
hr = script_dispatch->QueryInterface<IDispatchEx>(&script_engine);
// Create the variables we need
DISPPARAMS no_arguments_dispatch_params = { NULL, NULL, 0, 0 };
CComVariant created_javascript_object;
DISPID dispatch_id;
// Find the javascript object using the IDispatchEx of the script engine
std::wstring item_type = L"Object";
CComBSTR name(item_type.c_str());
hr = script_engine->GetDispID(name, 0, &dispatch_id);
// Create the jscript object by calling its constructor
// The below InvokeEx call returns E_INVALIDARG in this case
hr = script_engine->InvokeEx(dispatch_id,
LOCALE_USER_DEFAULT,
DISPATCH_CONSTRUCT,
&no_arguments_dispatch_params,
&created_javascript_object,
NULL,
NULL);
*created_object = created_javascript_object;
return status_code;
}
Потенциальные ответчики, желающие получить полностью компилируемое решение, могут найти версию вышеуказанного кода в GitHub repo .Репозиторий включает решение Visual Studio 2017, которое создает консольное приложение, которое будет воспроизводить проблему, включая запуск Internet Explorer и получение ссылки на требуемый объект IHTMLDocument2
.Обратите внимание, что версия в репо имеет несколько более полную обработку ошибок, чем приведенный выше пример, в котором она была опущена для краткости.