【问题标题】:How to instantiate the IWebViewControl in MFC or C++?如何在 MFC 或 C++ 中实例化 IWebViewControl?
【发布时间】:2019-02-01 20:47:11
【问题描述】:

最近微软为 WPF 和 winforms 引入了IWebViewControlIWebViewControl 使用边缘渲染引擎。 使用类构造函数实例化IWebViewControl 非常容易,但我不确定如何在 MFC 或 C++ 中实例化IWebViewControl

https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview

【问题讨论】:

  • 您应该适当地标记您的问题c++-winrt,因为这是在 C++ 应用程序中使用 Windows 运行时的现代框架。
  • @zett42:不一定。 C++/WinRT 是一个 库,可用于激活 Windows 运行时类型。 WRL 是另一个。还有其他人。虽然我建议自己使用 C++/WinRT,但这也需要你有一个 C++17 编译器。不是每个人都这样做,而且 MFC 是一个框架,经常在项目中使用,只能使用特定版本的 Visual Studio 构建。添加c++-winrt 标签可能不合适。
  • 我没有亲自尝试过,但是您显然可以在本机应用程序中托管 UWP 控件。 docs.microsoft.com/en-us/windows/uwp/xaml-platform/…
  • 你是怎么做到的?难道我们不能在MFC应用中使用Win32 SDK吗?

标签: c++ mfc windows-runtime


【解决方案1】:

这是 C++ 中的 IWebViewControl 示例: https://github.com/rjmurillo/webview-samples/tree/master/WinMD/Win32/WebViewSamples.Win32

摘自代码:

void CheckFailure(_In_ HRESULT hr)
{
    if (FAILED(hr))
    {
        WCHAR message[512] = L"";
        StringCchPrintf(message, ARRAYSIZE(message), L"Error: 0x%x", hr);
        MessageBoxW(nullptr, message, nullptr, MB_OK);
        ExitProcess(-1);
    }
}

template <typename TInterface>
Microsoft::WRL::ComPtr<TInterface> GetActivationFactoryFailFast(_In_z_ PCWSTR factoryClassName)
{
    ComPtr<TInterface> factoryInstance;
    CheckFailure(RoGetActivationFactory(
        HStringReference(factoryClassName).Get(),
        IID_PPV_ARGS(&factoryInstance)));
    return factoryInstance;
}

template <typename TInterface>
Microsoft::WRL::ComPtr<TInterface> ActivateInstanceFailFast(_In_z_ PCWSTR className)
{
    ComPtr<TInterface> classInstanceAsInspectable;
    ComPtr<TInterface> classInstance;
    CheckFailure(RoActivateInstance(
        HStringReference(className).Get(),
        &classInstanceAsInspectable));
    CheckFailure(classInstanceAsInspectable.As(&classInstance));
    return classInstance;
}

ComPtr<IUriRuntimeClass> CreateWinRtUri(_In_z_ PCWSTR uri, _In_ bool allowInvalidUri = false)
{
    auto uriRuntimeClassFactory = GetActivationFactoryFailFast<IUriRuntimeClassFactory>(RuntimeClass_Windows_Foundation_Uri);
    ComPtr<IUriRuntimeClass> uriRuntimeClass;
    if (!allowInvalidUri)
    {
        CheckFailure(uriRuntimeClassFactory->CreateUri(HStringReference(uri).Get(), &uriRuntimeClass));
    }
    else
    {
        uriRuntimeClassFactory->CreateUri(HStringReference(uri).Get(), &uriRuntimeClass);
    }
    return uriRuntimeClass;
}

m_processOptions = ActivateInstanceFailFast<IWebViewControlProcessOptions>(RuntimeClass_Windows_Web_UI_Interop_WebViewControlProcessOptions);
ComPtr<IWebViewControlProcessFactory> webViewControlProcessFactory = GetActivationFactoryFailFast<IWebViewControlProcessFactory>(RuntimeClass_Windows_Web_UI_Interop_WebViewControlProcess);
CheckFailure(webViewControlProcessFactory->CreateWithOptions(m_processOptions.Get(), &m_process));
ComPtr<IAsyncOperation<WebViewControl*>> createWebViewAsyncOperation;
CheckFailure(m_process->CreateWebViewControlAsync(reinterpret_cast<INT64>(m_hostWindow), HwndWindowRectToBoundsRect(m_hostWindow), &createWebViewAsyncOperation));
HRESULT hr = createWebViewAsyncOperation->put_Completed(Callback<IAsyncOperationCompletedHandler<WebViewControl*>>([this, createWebViewAsyncOperation](IAsyncOperation<WebViewControl*>*, AsyncStatus status) -> HRESULT
{
    CheckFailure(createWebViewAsyncOperation->GetResults(&m_webViewControl));
    NavigateToUri(L"https://www.bing.com/");
    return S_OK;
}).Get());
CheckFailure(hr);

【讨论】:

    【解决方案2】:

    我不知道这是否是这样的答案,并会根据要求将其删除。 M但微软现在有一个测试版的 WebView2,它有一个 Win32 变体:

    https://docs.microsoft.com/en-us/microsoft-edge/webview2/gettingstarted/win32

    MFC 是 Win32/Win64 应用,不能使用这个 SDK 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多