1

我正在尝试使用 Chromium Embedded Framework 的 CefSharp CLR 绑定来创建一个替代的 Web 浏览器控件,我们可以将其嵌入到仅支持旧版 ActiveX 控件(WonderWare InTouch HMI)的应用程序中,以尝试获得一些对某些 reeaaallly 的 HTML5 支持旧机器。

到目前为止,我已经使用Microsoft InteropForms Toolkit创建了一个 Interop 用户控件,并以非常简单的方式将 CefSharp.WinForms WebView 嵌入到控件中,即

Private Sub WebControl_Load(sender As Object, e As EventArgs) Handles Me.Load

    Dim Settings = New CefSharp.Settings
    If (CEF.Initialize(Settings)) Then
        WebView = New WebView(homepage, New BrowserSettings())
        WebView.Dock = DockStyle.Fill
    End If

    Me.Controls.Add(WebView)

End Sub

当我构建 DLL 时,我通过命令注册它

regasm /tlb /codebase Cefsharp.WebControl.dll

这似乎在大多数情况下都有效,但我遇到了一些我不完全理解的问题。我正在使用 Excel 中的 VBA 表单对其进行测试(纯粹是为了方便),当我使用表单生成器时,它实际上会在将控件添加到用户表单并完美加载网页时对其进行初始化:

IDE 示例

但是,当我尝试显示 UseForm 时,它似乎破坏了 webview 的句柄或实例(或两者),我不知道如何修复它。一旦我尝试显示表格并尝试类似

Sub Test()
    WebForm.Show
    WebForm.WebControl.Navigate "www.google.com"
End Sub

我收到该对象不存在的错误。我有点搞砸了,有时我会遇到不同的错误,比如指针无效,但到目前为止我还没有弄清楚如何正确设置它。我认为这是处理用户表单事件的问题,但我不确定。

如果有人对此有任何见解,我将不胜感激。谢谢!

4

1 回答 1

1

好的,我想通了!我认为这部分与处理程序有关,部分与我初始化 webview 的方式/时间有关。我使用的解决方案最终使用 CefSharp.Wpf 而不是 Windows 窗体,但它几乎是相同的。主要区别在于在 WebControl 设计器上添加 ElementHost 控件的初始化并创建新的 WebView 作为组件初始化的一部分:

'Do not change this subroutine in the code editor. Use the designer.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
    Me.WebHost = New System.Windows.Forms.Integration.ElementHost()
    Me.SuspendLayout
    '
    'WebHost
    '
    Me.WebHost.Dock = System.Windows.Forms.DockStyle.Fill
    Me.WebHost.Location = New System.Drawing.Point(0, 0)
    Me.WebHost.Name = "WebHost"
    Me.WebHost.Size = New System.Drawing.Size(404, 244)
    Me.WebHost.TabIndex = 0
    Me.WebHost.Text = "WebHost"
    Me.WebHost.Child = New WebView(homepage, New CefSharp.BrowserSettings)
    '
    'WebControl
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.Controls.Add(Me.WebHost)
    Me.Name = "WebControl"
    Me.Size = New System.Drawing.Size(404, 244)
    Me.ResumeLayout(false)

End Sub

Friend WithEvents WebHost As System.Windows.Forms.Integration.ElementHost
于 2013-12-12T13:28:39.123 回答