http://www.jituannet.com/archives/category/%E4%BA%92%E8%81%94%E7%BD%91/page/2
首先,必须有COM的基础知识,因为IE本身就是COM技术的典型应用。我们看到最上层是WebBrowser的宿主(Host),也就是任何你想重用 (ReUse)webbrowser control的应用程序,可以是vb程序,也可以是vc或者任何其他语言的应用程序。应用程序必须是可容纳activex控件的容器。
Webbrowser control既是activex control也是activex document 的宿主。作为控件,它可以置于任何activex容器,作为文档容器,它针对特殊的类型,调用特殊类型注册的文档server以显示文档。如果你想显示一 个.doc文档,webbrowser control装载windows word,,对于html文档,webbrowser装载名为mshtml的组件(如图所示)。针对不同的文档,你不需要开发不同的应用,仅仅是调用 webbrowser control即可。
Shdocvw
Shdocvw.dll包含了webbrowser control ,控制webbrowser control (就像控制其他任何activex com 控件一样),提供浏览能力给上层宿主。请注意webbrowser control位于第二级中。甚至IE也不直接而是通过shdocw.dll来使用webbrowser control的。尽管shdocvw提供了大部分的浏览功能,但是并不提供IE窗口的呈现功能。尽管如此,shdocvw还是提供了简单创建web 应用程序的能力。之后章节会讲到如何将ie的高级特性加入到你的应用程序。
MSHTML
早期的mshtml具有读取显示html的功能。MSHTML实际上是一个active 文档服务器,但是却可以作为其他控件的容器(如图中所示的)。记得吗,你可以将activex控件置于html中,此时mshtml就是一个 activex宿主,还可以控制其他的控件如vbscript 脚本引擎和javascript脚本引擎,java applet,geszhong,各种插件—别意外,plug-in都是按照ie activex规范写的。
WebBrowser 怎么使用?
二、
WebBrowser Control 与 Internet Explorer
二者又太多的共同点,你都是通过COM接口来访问其功能。当调用webbrowser控件时,使用的是webbrowser对象,在vc中是使用class ID CLSID_WebBrowser的接口类。
当自动化ie时,必须建立名为 InternetExplorer的对象,vc等语言中使用名为class ID CLSID_InternetExplorer的接口类。
接口
webbrowser有4个接口(如图),其中3个提供全部的功能,第4个DWebBrowserEvents2接口暴露事件
ie4 之前,仅有IwebBrowser和IwebBrowserApp两个接口,且二者共享相同的功能,当开发ie4时候,决定加入第三个接口IWebBrowser2扩展webbrowser的功能。该接口派生于第二个接口。
IWebBrowser
IWebBrowser 仅仅是WebBrowser control的最初接口, 提供基本的例如导航web页面的功能。 作为其他派生接口的基础接口,有8个方法和30个属性。
方法描述
GoBack
导航到历史列表中的上一个页面
GoForward
导航到历史历表中的下一个项目
GoHome
导航到缺省页面.
Refresh
刷新当前页面
Refresh2
可以选择刷新级别,如下:
REFRESH_NORMAL 普通刷新,并且不发送HTTP pragma:nocache 到服务器.
REFRESH_IFEXPIRED 仅仅当页面失效时才发送刷新请求
REFRESH_CONTINUE 内部使用,不要在编程时使用
REFRESH_COMPLETELY 发送HTTP pragma:nocache header 到服务器
Stop
停止当前导航
WebBrowser 怎么使用?尽管WebBrowser control 提供了你需要的导航回退以及前向的方法,但是没有提供存取历史列表的途径. 你可与直接通过属性LocationUR来获取当前页的URL.
在VB或者VC++中调用GoBack 和 GoForward 方法式很容易的.你可以使用WebBrowser control 或者 Internet Explorer对象. 举例来讲,在VB中你可以如下调用:
WebBrowser1.GoBack ‘ Hosting WebBrowser control
InternetExplorer1.GoForward’ Automating Internet Explorer object
VC++中如下:
m_webBrowser.GoBack();// Hosting WebBrowser control
m_pInternetExplorer->GoForward(); // Automating Internet Explorer object
尽管 GoBack 和 GoForward方法十分重要,当控制WebBrowser control或者自动化操作 Internet Explorer,Navigate is 却是最重要的方法. Navigate 允许你导航到特定的你所想的web页或者文件. Navigate 带有5个参数,允许你指定特定的URL以实现导航以及其他定义导航行为的信息.
第一个参数是 URL,指示web页的位置和名称或者何处的文件你想装载。 (此参数类型是 BSTR.) URL 可以是你所使用的标准URL 协议类型的一种,例如HTTP 和 FILE,或者是全路经文件名的本地文件系统,例如 C:\MyFile.htm.
第二个参数,Flags,你可指定如何或者甚至何处装载特定的URL. (参数的类型是指向 VARIANT的指针) Flags 的值来自名为 BrowserNavConstants 的枚举类型 ,定义于 ExDisp.h 头文件中且有6个值,详细解释见下列表. 你可以指定一个或者多个Flags 参数值 (请留意有些当前并未实现).
navOpenInNewWindow. 将导致一个新的窗口打开以显示URL. 缺省,如果你在自己的应用程序中控制 WebBrowser control,这些值将导致新的 Internet Explorer 浏览器窗口打开.
navNoHistory. 指定此URL将不加入到URL历史列表中
navNoReadFromCache. 当前未实现.
navNoWriteToCache. 当前未实现.
navAllowAutoSearch. 如果指定的URL未找到,自动搜索功能将试图导航到通常的顶级域名如.com .net .org以找到正确的URL。如果失败, URL将传递给搜索引擎.
navBrowserBar. 如果可能,将 URL 装入到 Explorer 的地址栏Bar。
你可以使用 PostData 参数 (第四个)通过HTTPpost事务将指定特定的数据发送到服务器. (参数的类型是指向 VARIANT的指针) Post 处理用于将在HTML表单收集的数据发送到服务器。如果此参数不指定任何数据,Navigate 方法将使用Get方法. 另外,如果你不指定 HTTP 协议的URL (换句话讲,如果你指定例如 FILE 协议的 URL),PostData 参数将被忽略。
你也可以使用第五个参数,Headers,以发送HTTP 头信息到服务器. (T参数的类型是指向 VARIANT的指针) 这些加入的头信息将被 WebBrowser 控件如常发送出去. 作为 PostData 参数,如果你并不指定第一个参数,Headers 将被忽略.WebBrowser 怎么使用?
WebBrowser1.Navigate “http://www.microsoft.com”;
VB代码调用Navigate 如此容易因为所有参数出第一个参数外都可以是可选. 如此相对照,VC++不可以省略任何参数. 如果你想使用VC++不是勇任何特别的参数导航到 Microsoft的 home page,你必须传递空的VARIANT 结构。 MFC 应用程序,你必须如下调用 Navigate
COleVariant vtEmpty;
m_webBrowser.Navigate(_T(“http://www.microsoft.com”;),&vtEmpty,
&vtEmpty,&vtEmpty);
该例子展示了在MFC应用程序中控制WebBrowser控件. 我传递一个普通的字符串而替代 BSTR 因为 MFC 提供了一个 WebBrowser 控件的包装类,第一个载包装类中是LPCTSTR,一个普通的字符串. 其他参数为指向 VARIANT 结构的指针。 如果你不想指定任何特别的参数,别仅仅传递 NULL —那样做,你的应用程序会招来崩溃。你必须传递一个空的VARIANT 结构的指针. 前面的代码使用了 COleVariant 类,那是一个与 CComVariant 类相似的类。 COleVariant 简单包装了 VARIANT 使得VARIANT 结构易于使用.
属性 现在你看到了所有的 IwebBrowser 的方法,你大概向了解其属性。(我是不是太苛求了?)IWebBrowser 接口有30个属性,描述于表6-2. 我一已按照IWebBrowser的Vtable中的字母序列出。
Table 6-2. IWebBrowser 属性按照vtable排序
描述
Application
返回宿主WebBrowser 控件的自动化对象 (IDispatch) 实现,如果对象不可用,则返回的WebbOrwser控件的自动化对象
Parent
返回WebBrowser控件的父控件的自动化实现 (IDispatch) ,通常是容器—举例来讲,,您的宿主或者Internet Explorer 窗口。
Container
返回WebBrowser控件容器的自动化对象 (IDispatch) 。通常,该值返回同 Parent 属性一样的值。.
Document
返回活动文档的自动化实现 (IDispatch) 。如果 HTML 当前显示在WebBrowser, Document 属性给出你存取 DHTML 对象模型的途径.
TopLevelContainer
返回一个布尔值指示IE是否是WebBRowser控件的顶级容器。在 words中,如果IE是宿主应用承需则返回true
Type
返回已经在WebBrowser中装载的对象的类型。举例,如果HTML document被装载,Type 将返回 Microsoft HTML Document 5.0. 如果文档是Word 文档,Type 返回 Microsoft Word Document.
Left
.返回或设置控件在容器窗口左边距
Top
.返回或设置控件在容器窗口顶部边距
Width
返回或设置webbrowser控件在窗口中的水平方向的向苏为单位宽度
Height
返回或设置webbrowser控件在窗口中的处置方向的向像素为单位高度
LocationName
返回一个WebBrowser当前显示的资源名称的字符串 (换句话讲,HTML 页,Word 文档,,folder,诸如此类) 。 如果资源是 HTML 页,字符串是标题。如果资源是文件或者文件夹,字符串为文件名或者文件夹名。—举例,foo.doc (Word文档)或者Temp (temp directory.)
LocationURL
返回WebBrowser正在显示的资源的URL
Busy
返回一个布尔值指示WebBrowser 当前是否正在装入 URL.。如果当前属性返回 true,你可以使用 Stop 方法取消代掉导航。
看完表 6-2,清晰展示了你可使用的属性. 当中的一些可能需要更多的解释. IWebBrowser 使用的相当多的一个属性是 LocationURL,给出了当前你装入WebBrowser窗口的 URL。 获取 LocationURL 值在VB中相当容易:
Dim strLocation
strLocation = WebBrowser1.LocationURL
Visual C++的MFC应用,MFC 包装类使的访问LocationURL 很容易. 你简单调用 GetLocationURL 方法,该方法返回一个 CString 对象. 当你想在自动化IE中或者webBrowser的MFC应用中访问 LocationURL when automating Internet Explorer or when hosting the WebBrowser control in a C++ application that’s not built by using MFC,你必须调用携带一指向BSTR的指针。 BSTR 将包含返回值. 此处展示如何在 C++中使用:
BSTR bstrURL;
m_pInternetExplorer->get_LocationURL(&bstrURL);
存取 Document 属性在VB中相当容易,当定义一个变量后(举例,HtmlDoc),值需要 set 为 Document 属性:
Set HtmlDoc = WebBrowser1.Document
MFC 中也很容易,使用 MFC 包装类的GetDocument方法:
IDispatch* pDisp;
pDisp = m_webBrowser.GetDocument();
GetDocument 返回指向代表文档 IDispatch 接口的指针. 如果 GetDocument 失败,该对象将为NULL.
非MFC C++ 应用或者任何自动化IE的C++ 应用访问Document 属性就只能够采用调用COM的方法—通过属性的get_方法. (注艺属性实只读,所以这里无put_ 方法.) 当调用 Document的get_ 方法,你传递一个接受 IDispatch 的指针.此处展示了如何调用:
IDispatch* pDisp;
HRESULT hr = m_pInternetExplorer->get_Document(&pDisp);
当使用这些代码,你可以使用 SUCCEEDED 宏( Win32 API的一部分),以监测调用是否成功。在尝试使用Idispatch接口前你应当确信调用成功。
IWebBrowserApp
IWebBrowserApp 接口仅仅在IE中实现。 典型的,你使用InternetExplorer 对象创建一个IE的实例. 然后你使用 IWebBrowserApp 接口操纵此实例. (今天采用IWebBrowser2 替代) IWebBrowserApp 接口继承自 IWebBrowser,所以它提供 IWebBrowser 的全部功能。
因为IWebBrowserApp呈现一个IE窗口的实例,所以它的方法和属性典型地允许你控制浏览器窗口的用户接口。 这些方法和属性并非包含在WebBrowser的 IWebBrowser 中的:寄宿control的应用程序提供诸如状态条,工具条,以及菜单条等用户接口. WebBrowser 控件仅仅用于装载web页以及其它类型文件。
方法 IWebBrowserApp 接口的属性很直观立如下表,但是有2个有理由值的讨论:GetProperty 和 PutProperty. 此两个方法允许你在IE属性包(property bag)中存储一个属性一边你能够在其后重新找回他们。 你将典型地从一个web页上存储一些状态信息到另一个web页 (事实上,使用IWebBrowser2 接口你可以在宿主一个WebBrowser 控件时候使用此方法)
Table 6-3. IWebBrowserAppvtable 次序的方法
描述
Quit
促使 Internet Explorer 窗口关闭。换句话讲,将自动化操作关闭IE实例
ClientToWindow
转换一个点从窗口坐标到客户坐标。
PutProperty
存储一个属性值到ie的属性包,将可以随手采用GetProperty.获取
GetProperty
WebBrowser 怎么使用?
VB代码:
InternetExplorer1.PutProperty “CurrentPicture”,10
InternetExplorer1.GetProperty(“CurrentPicture”)
VC++代码:
CSomeClass::PutGetProperty(VARIANT vtCurrentvalue,VARIANT* vtNewvalue)
{
HRESULT hr;
hr = m_pInternetExplorer->PutProperty(L”CurrentPicture”,
vtCurrentvalue);
if (SUCCEEDED(hr))
{
// Notice that vtNewvalue is already a pointer,so you
// don’t have to pass the address to GetProperty.
//
hr = m_pInternetExplorer->GetProperty(L”CurrentPicture”,
vtNewvalue);
}
return hr;
}
PutGetProperty 方法接受包含当前属性值的 VARIANT 变量指针且将接收属性值。
属性 IWebBrowserApp 接口有10 个属性. Table 6-4. IWebBrowserApp vtable 次序的属性
描述
Name
返回对象的名称t. (举例,当自动化IE, Name 属性将返回 Microsoft Internet Explorer.)
HWND
返回IE窗口的句柄
FullName
返回ie可执行文件的全路径 (iexplore.exe).
Path
返回IE应用程序的全路径.
Visible
监测和设置IE窗口是否可见。 (换句话讲,你可与使用此属性显示/隐藏)
StatusBar
显示或者隐藏IE状态条,也可监测当前状态条
StatusText
设置或隐藏状态条文字
ToolBar
显示或者隐藏IE工具条,也可监测当前工具条状态
MenuBar
FullScreen
设置或者检测一个值指示IE当前是否最大化显示。最大化显示,iE占据整个屏幕
Table 6-4 中的属性列表直截了当且易于使用。举例来说, 如果你想从你的Vb程序中获取IE状态条中的文字,你应当使用如下代码:
Dim strStatusText
strStatusText = InternetExplorer1.StatusText
使用MFC包装类的VC++程序代码如下:
BSTR bstrStatusText;
HRESULT hr = m_pInternetExplorer->get_StatusText(&bstrStatusText);
IWebBrowser2
因为COM规则要求接口恒久不变,要加入新的工呢高COM,你必须增加新的接口。 新的接口可扩展自其他接口已扩展功能。 举例,当心的需求引入WebBrowser 和Internet Explorer 接口,开发者被要求建立一个新的接口: IWebBrowser2.
早期,IWebBrowser2 继承自 IWebBrowser 和 IWebBrowserApp,还提供不包含在着两个接口中的功能. 所以你应当使用 IWebBrowser2 接口替代 来操纵WebBrowser 控件或者 Internet Explorer.
方法 IWebBrowser2 接口方法如下描述,按照 vtable 次序,in Table 6-5.
也许IWebBrowser2 、接口踵使用最多的方法是ExecWB. 它通过WebBrowser实现了一个IOleCommandTarget 接口的Exec的包装实现。 在 ExecWB 方法 被创建前,你不可以直接从VB中调用IOleCommandTarget::Exec,因为VB不可访问 IOleCommandTarget 接口 ,因而VB不可直接使用该接口的ExecWB方法。 IOleCommandTarget::Exec 方法过去大量使用,所以 WebBrowser 开发者决定创建ExecWB 以使事情变得容易。
Table 6-5. IWebBrowser2Vtable 次序的方法
描述
Navigate2
功能基于Navigate 方法,不同在于 Navigate2 允许你导航到飞URL表达的地方,例如Windows shell folder. (Windows shell folder 是指向标示符指针,或者windows shell命名空间中的 PIDL,)
QueryStatusWB
IoleCommandTarget接口的QueryStatus方法在 WebBrowser.中的包装实现
ExecWB
IoleCommandTarget接口的Exec方法在 WebBrowser.中的包装实现
ShowBrowserBar
显示或者隐藏特定的浏览器条. 该方法仅仅用于InternetExplorer 对象
为什么你无论如何都要调用ExecWB方法?因为它提供了你需要的功能(通过IOleCommandTarget::Exec)不是暴露于 webbrowser接口。你大概疑惑于为社么开发者不实现扩展属性和方法。记住:COM规则是一旦接口发表就不可改变。所以你不能够不能增加功能而不创 建新的接口。
ExecWB 方法允许WebBrowser 开发者增加新的功能而不用创建新的接口。再之,那是由WebBrowser 通过 ExecWB 代表性的暴露不常用的工的途径,譬如调用 Save As 对话框或者缩放web页的字体。ExecWB 工作的方法是传递一个你想调用的command ID 和必需的参数. 太多的 command IDs ,他们包含于OLECMDID 实现文档头文件he DocObj.h .
作为举例,支持缩放web页的内容字体。Internet Explorer 允许你通过View菜单的Text Size子菜单改变字体的大小从最小到最大。 ExecWB 方法暴露了允许你改变显示在浏览器中的文字大小。对于Zoom 命令,你可指定特殊值0,1,2,3,or 4,0 是最小字体 ,4是最大字体。以下举例为改变字体为最大(VB):
WebBrowser1.ExecWB OLECMDID_ZOOM,OLECMDEXECOPT_DONTPROMPTUSER,_
CLng(4),Null
再次代码中,我调用 ExecWB 方法,传递OLECMDID_ZOOM 常量给第一个参数. 此常量指定 zoom 操作将被执行。 第二个参数传递给ExecWB 不要提示用户。另外的选择,你可以提醒用户而是用OLECMDEXECOPT_PROMPTUSER. (见 DocObj.h.)
第三个输入参数指示要设定的文字尺寸。我想是文字尽可能的大,所以我指定了4 。注意我在调用中使用了VB的Clng函数包装此值,转换我指定的此值为一个variant—输入需要的类型.最后为一个输出参数包含任何返回值。因为返回值不需要关心,我传递Null.
属性 IWebBrowser2 接口有8个属性。 (Table 6-6 按照vtable次序展示其)。他们都很直观,我仅仅解释恰宏很特别的一个—AddressBar.
Table 6-6. IWebBrowser2 Properties in Vtable Order
描述
ReadyState
返回WebBrowser 的状态(换句话讲 ,该属性指示文档是否完成装载). 尽管你可以使用 ReadyState 属性,使用 DocumentComplete 时间检测文档是否装载还是比较好些。 (那意味着所有HTML和文档被装载
Offline
.返回或者设置检测webbrowser是否处于脱机模式的变量
Silent
返回或设置 WebBrowser 是否处于沉默模式。如果处于沉默模式,意味着没有对话框可以被显示.
RegisterAsBrowser
.设置或者检测Webbrowser是否是作为顶层浏览器被登记
RegisterAsDropTarget
.设置或返回WebBrowser是否作为导航的拖放对象 。如果登记委托放对象,用户可直接拖放连接到浏览器
TheaterMode
返回或者设置Internet Explorer是否处于theater 或者 normal window 模式.。在theater 模式,Internet Explorer占据整个屏幕就像处于FullScreen 模式,但也有最小化的用户接口元素 (此属性仅仅展示于InternetExplorer 对象)
AddressBar
显示或者隐藏地址栏(此属性仅仅展示于InternetExplorer 对象)
Resizable
返回或者设置Internet Explorer是否可被调整大小,你可利用此属性防止用户改变webbrowser的大小(此属性仅仅展示于InternetExplorer 对象)
AddressBar 属性允许你显示/隐藏Internet Explorer 地址栏—一个包含可输入URL的文本框 允许你导航到某个Url。 能够显示或者隐藏地址条允许你完全控制你的用户的导航体验
在你的企业网络或者中小学控制用户导航体验.在此环境下,你将控制用户的导航以至于可确定某些不恰当地页面不可访问。你可创建你自己的浏览器。但是如果你 没有时间和资源这么做,你可以自动化IE来代替.自动化IE允许你管掉所有的用户界面允许用户导航到某个web页,像菜单条,以地址栏. 之后你可建立一定数量的可访问web页连接列表给用户。
InternetExplorer1.AddressBar = False
InternetExplorer1.ToolBar = False
InternetExplorer1.MenuBar = False
Dim WebCount As SHDocVwCtl.ShellWindows
Set WebCount = New SHDocVwCtl.ShellWindows
MsgBox “已经打开” & WebCount.Count & “个网页”
执行后能得到Microsoft Internet Explorer 和 Maxthon(遨游,原名:MyIE2)浏览器打开的网页个数
Private Sub Form_Load()
Dim objIE As Object
For Each objIE In dWinFolder
If InStr(1,objIE.FullName,“IEXPLORE.EXE”,vbTextCompare) <> 0 Then
List1.AddItem objIE.LocationURL
End If
Next
Command1.Caption = “正文”
End Sub
‘以下是遍历所有的IE窗口,包括MyIE等基于IE控件的其他浏览器。 ‘我在windows2000+myie2调试通过。至于你说用控件可以解决,我好像还没看到这样的控件。 ”””””””””””””””””””””””””””””””””””””””’ ‘Addressof 一定要放在标准模块中,所以以下部分放在标准模块中,在外面调用 GetAllIEAddress 就是 Option Explicit Private Type GUID ‘相关 API 函数声明 Private Declare Function EnumWindows Lib “user32″ (ByVal lpEnumFunc As Any,ByVal lParam As Long) As Long’枚举窗口列表中的所有父窗口(顶级和被所有窗口) Private strIEAddress As String Public Function GetAllIEAddress() As String EnumWindows AddressOf EnumProc,0 ‘If strIEAddress <> “” Then End Function ‘遍查主窗口 ‘得到窗体标题,这里没有用上 Dim strClassName As String * 1024 ‘判断是否为 IE 浏览器窗口 EnumProc = 1 ‘递归遍查子窗口 If SubWinClassName = “Internet Explorer_Server” Then num_children = 0 Do While child_hwnd <> 0 ‘如果有子窗口 For i = 1 To num_children ErrHandler: End Function Private Sub GetIEAddress(IEWid As Long) Dim hwId As Long Dim lMsg As Long SendMessageTimeout IEWid,lMsg,SMTO_ABORTIFHUNG,1000,lRes Dim IID_IHTMLDocument As GUID IID_IHTMLDocument.Data1 = &H626FC520 IID_IHTMLDocument.Data4(0) = &HA7 Dim myInstance As MSHTML.IHTMLDocument5 ObjectFromLresult lRes,IID_IHTMLDocument,myInstance If Not (myInstance Is Nothing) Then End Sub ‘去除非vb字符。
Private Type GUID Private Declare Function SendMessageByString Lib “user32″ Alias “SendMessageA” (ByVal hwnd As Long,ppvObject As Any) As Long ‘Form1.frm 文件 Private Sub Command1_Click() Dim hwId As Long hwId = FindWindow(“IEFrame”,vbNullString) Dim lMsg As Long SendMessageTimeout hwId,lRes Dim IID_IHTMLDocument As GUID IID_IHTMLDocument.Data1 = &H626FC520 IID_IHTMLDocument.Data4(0) = &HA7 ‘Debug.Print “{626FC520-A41E-11CF-A731-00A0C9082637}”’IHTMLDocument ‘IID_IHTMLDocument.Data4 = “626FC520-A41E-11CF-A731-00A0C9082637″ ObjectFromLresult lRes,myInstance If Not (myInstance Is Nothing) Then End If End Sub 8.获取webbrowser控件 网页的源码(收藏) 将其name属性设置为web Private Sub Command1_Click() Private Sub web_DocumentComplete(ByVal pDisp As Object,URL As Variant) =========================================================================================== ‘引用 Microsoft HTML Object Library Dim oDoc As HTMLDocument Set oDoc = WebBrowser1.Document’获得文档对象 sSelectedText = oTxtRgn.Text’选择区域文本赋值 oElement.Focus’”T1″对象获得焦点 oElement.Select’全选对象”T1″ Debug.Print “你选择了文本:” & sSelectedText 上面这段儿还附送了其他功能,呵呵。精简一下是这样: Set oDoc = WebBrowser1.Document ‘获得文档对象 sSelectedHTML = oTxtRgn.htmlText ‘选择区域文本赋值 Text1.Text=sSelectedHTML ‘文本框显示抓取得HTML源码 ================================================================================================== 我用WebBrowser取得网页源码,直接运行正常,但在编译后出错 Private Sub WebBrowser1_DownloadComplete() Set objhtml = doc.body.createtextrange() End Sub 我用WebBrowser取得网页源码,直接运行正常,但在编译后出错 提示:实时错误“91”Object 变量或 with 块变量没有设置 Private Sub WebBrowser1_DownloadComplete() Set objhtml = doc.body.createtextrange() 你要得网页源码用 xmlhttp比较好 先引用 msxml Dim x As New MSXML2.XMLHTTP MsgBox StrConv(x.responseBody,vbUnicode) =============================================================================================== ===================================================================================== Private Sub WebBrowser1_DownloadComplete() Private Sub Command1_Click() ================================================================================== private sub timer1_timer() if not webbrowser1.busy then Dim doc,objhtml As Object End If =================================================================================================== Private Declare Function InternetOpen Lib “wininet.dll” Alias “InternetOpenA” ( _ Private Function GetUrlFile(stUrl As String) As String Private Sub Command1_Click() ===================================================================================================== Set vDoc = WebBrowser1.Document ======================================================================================================================= |