我正在尝试使用Chromium Embedded Framework的CefSharp CLR绑定创建一个替代的Web浏览器控件,我们可以将其嵌入到仅支持旧版ActiveX控件(WonderWare InTouch HMI)的应用程序中,以获得一些HTML5支持对于一些reeaaallly旧机器。
到目前为止,我已经使用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表单进行测试(纯粹是出于方便),当我使用表单生成器时,它实际上在将控件添加到用户表单并初始化加载网页时初始化控件:
但是,当我尝试显示UseForm时,它似乎要么破坏句柄或webview的实例(或两者),我也无法弄清楚如何修复它。一旦我尝试显示表单并尝试类似
Sub Test()
WebForm.Show
WebForm.WebControl.Navigate "www.google.com"
End Sub
我收到对象不存在的错误。我已经搞砸了一下,有时我得到不同的错误,如指针无效,但到目前为止,我还没有弄清楚如何正确设置它。我认为这是处理用户表单事件的问题,但我不确定。
如果有人对此有任何见解,我将非常感激。谢谢!
答案 0 :(得分:0)
好的,我明白了!我认为这部分与处理程序有关,部分与我/何时初始化webview有关。我使用的解决方案最终使用CefSharp.Wpf而不是Windows窗体,但它大致相同。主要区别是在WebControl Designer上添加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