常见问题 (FAQ)
🔄 初始化与创建
❓ Q1: WebView2 创建失败怎么办?
现象: 调用 Initialize 后没有触发 Create 或 Ready 事件。
可能原因:
- 未安装 WebView2 Runtime
- 目标机器的 WebView2 版本过旧
- UserDataFolder 路径冲突
解决方案:
vb
' 检查 WebView2 是否已安装
' 查找路径: C:\Program Files (x86)\Microsoft\EdgeWebView\Application
' 指定最低版本号
wv.EnvironmentOptions.TargetCompatibleBrowserVersion = "86.0.616.0"cWebView2Host 内部有重试逻辑,最多尝试 10 次创建,每次自动递增 UserDataFolder 路径。
❓ Q2: Initialize 应该传入 Form 对象还是 hWnd?
两者都支持:
vb
wv.Initialize Me.hWnd, "https://vb6.pro" ' 传入窗口句柄
wv.Initialize Me, "https://vb6.pro" ' 传入 Form 对象(自动获取 hWnd)传入 Form 对象时,内部自动调用 Form.hWnd 获取窗口句柄。效果完全相同。
❓ Q3: 什么时候用两参数 Initialize,什么时候用一参数?
- 两参数
Initialize(hWnd, url)- 最常用,自动导航到指定 URL - 一参数
Initialize(hWnd)- 需要在导航前配置环境参数时使用
vb
' 简单场景:直接导航
wv.Initialize Me.hWnd, "https://vb6.pro"
' 高级场景:需要配置环境参数
wv.Initialize Me.hWnd ' 不立即导航
Private Sub wv_Create()
' 在导航前配置
wv.EnvironmentOptions.UserDataFolder = App.Path & "\UserData"
wv.Security.CertificateErrorAction = CEA_AlwaysAllow
End Sub
Private Sub wv_Ready()
wv.Navigate "https://example.com"
End Sub🔗 数据绑定
❓ Q4: BindUI 回调方法必须是 Public 吗?
是的。BindUI 使用 CallByName 调用宿主方法,VB6 的 CallByName 只能调用 Public 成员。
vb
' 正确
Public Sub OnClick(ByVal EventName As String, ByVal Detail As String)
' 错误 - 不会被调用
Private Sub OnClick(ByVal EventName As String, ByVal Detail As String)❓ Q5: BindUI 如何获取 DOM 元素的值?
Detail 参数包含 JSON 格式的事件详情,不同事件的 Detail 不同。需要手动解析:
vb
Public Sub OnNameInput(ByVal EventName As String, ByVal Detail As String)
' Detail 示例: {"type":"input","value":"用户输入的文本"}
Dim val As String
val = JsonValue(Detail, "value")
wv.SetData "name", val
End Sub❓ Q6: SetData 可以传递数组或对象吗?
SetData 的 Value 参数是 Variant,内部直接生成 JS 字面量。传递复杂结构有两种方式:
vb
' 方式1:使用 innerHTML 属性绑定
wv.BindData "list", "#item-list", "innerHTML"
wv.SetData "list", "<li>Item 1</li><li>Item 2</li>"
' 方式2:调用 JS 函数处理 JSON
wv.JsRun "renderList(" & jsonString & ")"⚡ JavaScript 执行
❓ Q7: JsRun 和 ExecuteScript 有什么区别?
| 特性 | JsRun | ExecuteScript |
|---|---|---|
| 执行方式 | 同步(阻塞等待) | 异步(事件回调) |
| 返回值 | 直接返回 String | JsAsyncResult 事件 |
| WithEvents | 不需要 | 建议使用 |
| 典型场景 | 立即获取结果 | 不需等待结果 |
❓ Q8: JsRun 和 Script.Eval 有什么区别?
| 特性 | JsRun | Script.Eval |
|---|---|---|
| 输入 | JS 表达式/属性路径 | JS 代码段(支持 return) |
| 包装 | 直接执行 | 包装为 function 后执行 |
| 用法 | wv.JsRun("document.title") | wv.Script.Eval("return document.title") |
| 适用场景 | 简单表达式 | 复杂代码块 |
Script.Eval 会将代码包装为 function EvalFuncName(){...},注入后调用,因此需要使用 return 返回值。
🛡️ 安全
❓ Q9: 如何忽略 HTTPS 证书错误?
必须在 Create 事件中设置,在导航开始之前:
vb
Dim WithEvents wv As cWebView2Host
Private Sub Form_Load()
Set wv = New cWebView2Host
wv.Initialize Me.hWnd, "https://self-signed.example.com/"
End Sub
Private Sub wv_Create()
' 在导航前设置
wv.Security.CertificateErrorAction = CEA_AlwaysAllow
End Sub如果在 Create 事件之后设置则不生效。
❓ Q10: 如何禁用 DevTools 和右键菜单?
vb
Private Sub wv_Create()
wv.AreDevToolsEnabled = False
wv.AreDefaultContextMenusEnabled = False
End Sub🍪 Cookie
❓ Q11: GetCookies 和 GetCookiesFull 的区别?
| 方法 | 获取方式 | HttpOnly Cookie | 性能 |
|---|---|---|---|
Cookies.GetCookies | document.cookie | 不可见 | 快 |
Cookies.GetCookiesFull | CDP Network.getCookies | 可见 | 稍慢 |
Cookies.GetCookiesFullAsync | CDP 异步 | 可见 | 非阻塞 |
对于需要访问 HttpOnly Cookie 的场景,必须使用 GetCookiesFull 或 GetCookiesFullAsync。
🖥️ 宿主环境
❓ Q12: Access 中使用有什么限制?
Access 使用 MessageWindowAdapter,以下功能不可用:
- 宿主鼠标事件(HostMouse*)
- 宿主键盘事件(HostKeyDown/Up/Press)
- HostFocus / HostBlur 事件
替代方案:
- 使用 BindUI 绑定 DOM 事件
- 使用 UserMouse 系列事件(需 EnableUserMouseEvents = True)
❓ Q13: 多个 WebView2 实例如何共享或隔离会话?
通过 UserDataFolder 控制:
vb
' 共享会话:相同 UserDataFolder
wv1.EnvironmentOptions.UserDataFolder = App.Path & "\UserData"
wv2.EnvironmentOptions.UserDataFolder = App.Path & "\UserData"
' 隔离会话:不同 UserDataFolder
wv1.EnvironmentOptions.UserDataFolder = App.Path & "\UserDir\account-001"
wv2.EnvironmentOptions.UserDataFolder = App.Path & "\UserDir\account-002"共享会话的实例将共享 Cookie、localStorage 等。隔离会话完全独立。
📦 本地资源加载
❓ Q14: 如何加载本地 HTML 文件?
三种方式:
vb
' 方式1:传入本地文件夹路径(最简单)
wv.Initialize Me.hWnd, App.Path & "\www"
' 自动映射为 http://vbman2.com/index.html
' 方式2:虚拟主机名映射(推荐,支持 https 协议)
wv.Initialize Me.hWnd
' 在 wv_Ready 中:
wv.SetVirtualHostNameToFolderMapping "myapp.local", App.Path & "\www"
wv.Navigate "https://myapp.local/index.html"
' 方式3:从 VB6 资源文件加载(单文件分发)
wv.Initialize Me.hWnd
' 在 wv_Ready 中:
wv.NavigateToString VBMAN2.Res(LoadResData("INDEX.HTML", "WWW")).ReturnString()❓ Q15: 本地 HTML 中的 AJAX 请求跨域问题?
使用 SetVirtualHostNameToFolderMapping 方式加载时,页面以 https:// 协议运行,可以正常访问同协议的外部 API,不会遇到 file:// 协议的限制。
最后更新: 2026-06-24