Skip to content

常见问题 (FAQ)

🔄 初始化与创建

❓ Q1: WebView2 创建失败怎么办?

现象: 调用 Initialize 后没有触发 Create 或 Ready 事件。

可能原因:

  1. 未安装 WebView2 Runtime
  2. 目标机器的 WebView2 版本过旧
  3. 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 有什么区别?

特性JsRunExecuteScript
执行方式同步(阻塞等待)异步(事件回调)
返回值直接返回 StringJsAsyncResult 事件
WithEvents不需要建议使用
典型场景立即获取结果不需等待结果

❓ Q8: JsRun 和 Script.Eval 有什么区别?

特性JsRunScript.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

❓ Q11: GetCookies 和 GetCookiesFull 的区别?

方法获取方式HttpOnly Cookie性能
Cookies.GetCookiesdocument.cookie不可见
Cookies.GetCookiesFullCDP Network.getCookies可见稍慢
Cookies.GetCookiesFullAsyncCDP 异步可见非阻塞

对于需要访问 HttpOnly Cookie 的场景,必须使用 GetCookiesFullGetCookiesFullAsync


🖥️ 宿主环境

❓ 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

VB6及其LOGO版权为微软公司所有