如何从C ++在Internet Explorer中创建JavaScript对象

时间:2018-09-23 13:25:54

标签: c++ internet-explorer com

我正在使用外部C ++应用程序来控制Internet Explorer(版本为11,但是对于本示例来说似乎并不重要)。此控件的一部分是能够在浏览器的上下文中运行任意JavaScript。为了启用该控件,我希望能够创建一个JavaScript对象(或数组或函数等),该JavaScript对象由适当的IDispatch变体表示,可以在后续的脚本调用中使用。有些examples online,包括某些from 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对象的引用。请注意,回购中的版本比上面的示例具有更完整的错误处理,为简洁起见,省略了该示例。

0 个答案:

没有答案