能否不创建WebView2浏览器控件实例获取用户数据文件夹及运行时路径?
WebView2:无浏览器控件实例下的用户数据文件夹与运行时路径获取
一、不创建浏览器控件实例获取用户数据文件夹
你当前的代码是从已初始化的ICoreWebView2Environment7接口获取用户数据文件夹,实际上不需要创建WebView浏览器控件实例(ICoreWebView2),仅通过创建CoreWebView2Environment环境实例即可实现需求。
实现代码
#include <wil/com.h> #include <WebView2.h> void GetUserDataFolderWithoutWebView() { wil::com_ptr<ICoreWebView2Environment> environment; HRESULT hr = CreateCoreWebView2EnvironmentWithOptions( nullptr, // 使用默认WebView2运行时位置 nullptr, // 留空则系统生成默认用户数据文件夹;自定义路径可在此填写 nullptr, // 使用默认环境选项 Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>( [](HRESULT result, ICoreWebView2Environment* env) -> HRESULT { if (SUCCEEDED(result)) { // 查询ICoreWebView2Environment7接口以获取用户数据文件夹 wil::com_ptr<ICoreWebView2Environment7> environment7; if (SUCCEEDED(env->QueryInterface(IID_PPV_ARGS(&environment7)))) { wil::unique_cotaskmem_string userDataFolder; HRESULT hr = environment7->get_UserDataFolder(&userDataFolder); if (SUCCEEDED(hr)) { // 输出或使用用户数据文件夹路径 wprintf(L"User Data Folder: %s\n", userDataFolder.get()); } } } return S_OK; }).Get()); }
说明
- 仅初始化
CoreWebView2Environment环境实例,未创建任何WebView浏览器控件(ICoreWebView2对象),满足“不创建浏览器控件实例”的要求。 - 若给
CreateCoreWebView2EnvironmentWithOptions的第二个参数指定自定义路径,get_UserDataFolder会返回该路径;若留空,则返回系统自动生成的默认用户数据文件夹路径。
二、不创建浏览器实例获取运行时路径
直接使用WebView2 SDK提供的GetCoreWebView2BrowserPath函数,无需创建任何Environment或WebView实例,即可获取当前系统中可用的WebView2运行时安装路径。
实现代码
#include <wil/com.h> #include <WebView2.h> #include <iostream> std::wstring GetRuntimePathWithoutInstance() { wil::unique_cotaskmem_string browserPath; HRESULT hr = GetCoreWebView2BrowserPath(nullptr, &browserPath); if (SUCCEEDED(hr)) { return browserPath.get(); } // 处理获取失败的情况 return L""; } // 调用示例 int main() { std::wstring runtimePath = GetRuntimePathWithoutInstance(); if (!runtimePath.empty()) { std::wcout << L"WebView2 Runtime Path: " << runtimePath << std::endl; } return 0; }
补充:无实例获取版本信息
你已提供的版本信息获取代码均为无实例调用,这里做汇总说明:
获取运行时版本
std::wstring GetRuntimeVersion() { wil::unique_cotaskmem_string runtimeVersion; GetAvailableCoreWebView2BrowserVersionString(nullptr, &runtimeVersion); return runtimeVersion.get(); }
获取SDK构建版本
std::wstring GetSdkBuild() { auto options = Microsoft::WRL::Make<CoreWebView2EnvironmentOptions>(); wil::unique_cotaskmem_string targetVersion; CHECK_FAILURE(options->get_TargetCompatibleBrowserVersion(&targetVersion)); // 解析版本字符串提取构建号部分 const wchar_t* targetVersionMajorAndRest = targetVersion.get(); const wchar_t* targetVersionMinorAndRest = wcschr(targetVersionMajorAndRest, L'.'); CHECK_FAILURE((targetVersionMinorAndRest != nullptr && *targetVersionMinorAndRest == L'.') ? S_OK : E_UNEXPECTED); const wchar_t* targetVersionBuildAndRest = wcschr(targetVersionMinorAndRest + 1, L'.'); CHECK_FAILURE((targetVersionBuildAndRest != nullptr && *targetVersionBuildAndRest == L'.') ? S_OK : E_UNEXPECTED); return targetVersionBuildAndRest + 1; }
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

