1

我需要在 VB 屏幕中显示数据。我正在使用 WebBrowser 控件。

然后我使用这个命令:

m_oFrm.WebBrowser1.Document.Write (SHtml) 

在屏幕上显示输出。

语句在调试模式下运行良好,但在 EXE/DLL 中出现错误

未设置对象或变量

我使用了另一种选择:

Dim objHTMLDocScore As MSHTML.HTMLDocument
Set objHTMLDocScore  = m_oFrm.WebBrowser1.Document

接着

Document.Write (SHtml)

但是我在编译时遇到了错误

标记为受限的函数或接口,或函数使用 Visual Basic 不支持的自动化类型

我可以在 StackOverflow 中看到错误消息“函数或接口标记受限制,或者函数使用 Visual Basic 不支持的自动化类型”的问题,但我无法理解。

我使用的是 Internet Explorer 版本 8。

4

3 回答 3

3

您正在尝试写入尚未构建的文档。调试时,浏览器有时间构造对象,否则没有。

在写入之前检查 readyState 属性。

如果你想在导航到任何地方之前写,那么先导航到about:blank,等待readyState,然后写。

于 2012-09-20T20:46:32.417 回答
0

通常,DHTML Edit 控件更适合以下情况:

Private Sub Form_Load()
    With DHTMLEdit1
        .BrowseMode = True
        .DocumentHTML = "<html><body>Hello World!</body></html>"
    End With
End Sub

当然,您需要来自 Microsoft 的较新的(XP 后)TriEdit 包,并且很可能需要相关的 SDK 文档。

于 2012-09-20T21:06:37.963 回答
0

假设您的网络浏览器是 [WB]

private sub subOpenHtml(byval sHtml as string)

    WB.Navigate "about:blank" 'creates a document to do something on
    subBrowserStopClickSound 'stops ie click sound '(not necessary but a nice touch so users of your program don't know you are hijacking IE.

setdocretry:

    If WB.ReadyState = READYSTATE_COMPLETE Then
         If Not (WB.Document Is Nothing) Then
               WB.Document.open
               WB.Document.write sHtml
               WB.Document.Close
         Else
               Stop'error handling
         End If
    Else
        Pause.subFor 1
        GoTo setdocretry:
    End If

end sub 

subBrowserStopClickSound 的代码(单独的模块好主意):

在模块顶部:

Private Declare Function CoInternetSetFeatureEnabled Lib "urlmon.dll" (ByVal FeatureEntry As Integer, ByVal dwFlags As Long, ByVal fEnable As Long) As Long
Private Const FEATURE_DISABLE_NAVIGATION_SOUNDS = 21
Private Const SET_FEATURE_ON_PROCESS As Integer = &H2

下面:

private sub subBrowserStopClickSound 
    Call CoInternetSetFeatureEnabled(FEATURE_DISABLE_NAVIGATION_SOUNDS, SET_FEATURE_ON_PROCESS, True)
end sub 

暂停的代码:

同样,在一个单独的模块中(我发现这段代码在很多情况下都非常有用,并且是 DoEvents 的更好和更可控的替代方案)

模块顶部:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Type variables
               loldSecond As Long
End Type
Dim v As variables

下面:

Sub subFor(ByVal Delay As Single)

    Dim seconds As Long
    v.loldSecond = 0

    Delay = (Timer + Delay)

    Do
        DoEvents: DoEvents: DoEvents: DoEvents

         'tells us how many seconds left without decimal
         seconds = (Delay - Timer)

         Sleep 10
    Loop While Delay > Timer

End Sub

抱歉,如果我忽略了代码中的某些内容,如果是,请告诉我,以便我更正。

于 2017-02-23T00:01:56.347 回答