无法编译 WebView2 项目。需要自己的回调 class 模板

Can’t compile WebView2 project. Need own Callback class template

我使用的是 Visual Studio 2015,版本 14.0.23107.0。项目目标平台为10.0.17763.0.

我已阅读 this article, and did first steps. I downloaded webview2 solution from GitHub 并在 Visual Studio 中打开它。然后,通过 git NuGet 我成功添加了 Windows 实现库包(版本 1.0.200902.2)和 WebView2 包(版本 0.9.579)。

然后,在 HelloWebView.cpp 我添加了

#include "WebView2.h"

一开始编译不了。 HelloWebView.cppWebView2.h 中没有错误。问题出在 Windows 实现库中。

询问俄罗斯堆栈溢出 I got the solution - 不包括 Windows 实现库,而是 ATL,并且

static wil::com_ptr<ICoreWebView2Controller> webviewController;

// Pointer to WebView window
static wil::com_ptr<ICoreWebView2> webviewWindow;

替换为

static CComPtr<ICoreWebView2Controller> webviewController;

// Pointer to WebView window
static CComPtr <ICoreWebView2> webviewWindow;

并删除 using::Microsoft;

之后,项目编译,但 link 失败 - LINK1158 error, can’t run rc.exe。解决方案是 here(需要将 rc.exe 和 rcdll.dll 复制到某个文件夹)。

现在可以编译并运行了。

所以,我从文章的下一步开始,添加代码来创建 webview 并打开 url,但还是无法编译。只有一个问题 - 缺少 Windows 实现库中的 Callback 模板 class。

因此,要彻底解决问题,我唯一需要做的就是提供我自己的模板 Callback class。但是要怎么做呢?

当前临界区(回调被标记为错误)

CreateCoreWebView2EnvironmentWithOptions(nullptr, nullptr, nullptr,
Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(
  [hWnd](HRESULT result, ICoreWebView2Environment* env) -> HRESULT {

// Create a CoreWebView2Controller and get the associated CoreWebView2 whose parent is the main window hWnd
env->CreateCoreWebView2Controller(hWnd, Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(
  [hWnd](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {
  if (controller != nullptr) {
    webviewController = controller;
    webviewController->get_CoreWebView2(&webviewWindow);
  }

  // Add a few settings for the webview
  // The demo step is redundant since the values are the default settings
  ICoreWebView2Settings* Settings;
  webviewWindow->get_Settings(&Settings);
  Settings->put_IsScriptEnabled(TRUE);
  Settings->put_AreDefaultScriptDialogsEnabled(TRUE);
  Settings->put_IsWebMessageEnabled(TRUE);

  // Resize WebView to fit the bounds of the parent window
  RECT bounds;
  GetClientRect(hWnd, &bounds);
  webviewController->put_Bounds(bounds);

  // Schedule an async task to navigate to Bing
  webviewWindow->Navigate(L"https://www.bing.com/");

  // Step 4 - Navigation events

  // Step 5 - Scripting

  // Step 6 - Communication between host and web content

  return S_OK;
}).Get());
return S_OK;
}).Get());

Callback 来自 Windows 实现库的声明:

template<typename TDelegateInterface, typename TLambda>
ComPtr<typename Details::DelegateArgTraitsHelper<TDelegateInterface>::Interface> Callback(TLambda&& callback) throw()
{
using DelegateHelper = Details::DelegateArgTraitsHelper<TDelegateInterface>;
return DelegateHelper::Traits::template Callback<TDelegateInterface, typename DelegateHelper::Interface>(Details::Forward<TLambda>(callback));
}

源代码:https://github.com/MicrosoftEdge/WebView2Samples/tree/master/GettingStartedGuides/Win32_GettingStarted.


我不知道,我不是 c++11,14 特性的粉丝模板。

也许只是为了在之后调用代码?

似乎辛苦的夜晚在做他们的工作。 我只包括 WRL:

#include <wrl.h>

然后使用:

Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(... 

每出现一次就编译。

但又是一片空白window

This answer 帮助了我,现在我终于得到了我需要的工作解决方案。