无法编译 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.cpp
和 WebView2.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));
}
我不知道,我不是 c++11,14 特性的粉丝模板。
也许只是为了在之后调用代码?
似乎辛苦的夜晚在做他们的工作。
我只包括 WRL
:
#include <wrl.h>
然后使用:
Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(...
每出现一次就编译。
但又是一片空白window
This answer 帮助了我,现在我终于得到了我需要的工作解决方案。
我使用的是 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.cpp
和 WebView2.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));
}
我不知道,我不是 c++11,14 特性的粉丝模板。
也许只是为了在之后调用代码?
似乎辛苦的夜晚在做他们的工作。
我只包括 WRL
:
#include <wrl.h>
然后使用:
Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(...
每出现一次就编译。
但又是一片空白window
This answer 帮助了我,现在我终于得到了我需要的工作解决方案。