Как я могу создать объект JavaScript в Internet Explorer из C ++ - PullRequest
0 голосов
/ 23 сентября 2018

Я использую внешнее приложение 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.Обратите внимание, что версия в репо имеет несколько более полную обработку ошибок, чем приведенный выше пример, в котором она была опущена для краткости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...