Const Internet_Autodial_Force_Unattended As Long = 2Public Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal dwReserved As Long) As Long Public Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long ------------------------------------ Dim lResult As Long lResult = InternetAutodial(Internet_Autodial_Force_Unattended, 0&)
或:Dim X '"MyConnectionsName" is the name under the icon in Dial-up Networking X = Shell("rundll32.exe rnaui.dll,RnaDial " & "MyConnectionsName", 1) DoEvents 'You can type in your password before the { below. SendKeys "{enter}", True DoEvents 'End Sub
用mscomm是可以控制modem拨号,但是不能上网呀,vc里有rasdail,vb里没的。
化境编程界 -> 技术文章 -> VB/VB.Net 用VB实现自动上网提取信息(3)[ 作者: 马文骞 添加时间: 2001-8-21 9:26:00 ] Next Case "http://my.stockstar.com/scripts/mystockstar.dll?login" ' 当用户登录完成后,准备打开表格的第一页 WebBrowser1.Navigate "http://finance.stockstar.com/scripts/finance.dll?" + _ "showstkdfpm&begin=0&ret=1&index=2&concode=01" Page = 1 Case Else ' 当进入数据页面(表格的第一页至最后一页)时执行以下程序 Set Tables = WebBrowser1.Document.getElementsByTagName("Table") For Each Table1 In Tables If Left(Table1.innerText, 2) = "名次" Then ' 找到需要的Table ' 将表格转换成“.csv”格式 For i = 1 To Table1.rows.length - 1 Set Row = Table1.rows(i) j = 0 For Each Cell In Row.cells Text1 = Text1 + Trim(Row.cells(j).innerText) + "," j = j + 1 Next Text1 = Left(Text1, Len(Text1) - 1) + vbCrLf Next ' 数据存盘 Open "C:\Data.csv" For Append As #1 Print #1, Left(Text1, Len(Text1) - 2): Text1 = "": Close #1 Exit For End If Next ' 准备打开下一页 Page = Page + 1 tmp = "http://finance.stockstar.com/scripts/finance.dll?showstkdfpm&ret=" + _ Trim(Str(Page)) + "&index=2&concode=01" If Page <= 54 Then ' 判断是否浏览结束 WebBrowser1.Navigate tmp Else ' 上网任务完成后,应在此调用自动挂断过程。 Form1.MousePointer = 0 MsgBox "Finished!!": End End If End Select End Sub 以下给出的是上述程序所存数据文件的片段:1,乐凯胶片,600135,材料,81.493,18.445,23.165,8.850,20.717,10.315 2,歌华有线,600037,传播娱乐,80.553,13.009,22.256,12.141,20.304,12.844 3,外运发展,600270,仓储运输,80.326,17.331,23.005,8.829,19.900,11.261 4,东方钽业,0962,有色金属,80.312,15.160,22.483,11.648,21.290,9.730 5,双汇发展,0895,食品,79.772,15.428,20.673,11.508,20.235,11.930 6,四川美丰,0731,化肥,79.361,15.795,23.235,11.323,16.921,12.088 ... ... ... 1059,轮胎橡胶,600623,车类,7.167,8.265,10.973,-34.411,14.120,8.219 1060,PT吉轻工,0546,日用轻工产品,-11.895,5.740,-49.149,7.999,14.136,9.379 1061,广船国际,600685,机械仪器,-57.452,9.824,-1.528,-89.648,14.366,9.533 第三部分 自动拨号、自动挂断以及自动处理中途掉线 一个出色的“自动上网机器人”程序应能按照既定的时间准时开始拨号、并当所需任务已完成后立即挂断。而且仅做到这些还不够,它还应在发出拨号指令后跟踪拨号操作是否真的成功、上网速度如何、是否需要挂断后重新拨号、自动浏览过程中是否出现掉线、以及最终的挂断操作是否真的成功完成,等等。 因此,“机器人”程序应定时检查在线状况,以保证浏览时一定在在线状态、浏览完毕后一定不在在线状态。同时还要检查浏览进度,当浏览速度过慢时尝试挂断后重新拨号。 本部分讨论了实现“自动拨号”、“检查在线状况”、以及“自动挂断”这三个功能的若干方法,比较了诸方法各自的优劣,并总结给出了使用建议。本部分的示例程序将这三个功能的诸方法集成在一起,以便于大家对比使用(见下图)。1. 自动拨号 方法1A:使用rnaui.dll rnaui.dll是微软的“拨号网络用户接口”程序集,一般在“\Windows\System”目录下。其中的RnaDial程序用于启动拨号。该程序可在命令行执行(在“开始”->“运行”中键入): rundll32.exe rnaui.dll,RnaDial <拨号网络连接名> 其中的“RnaDial”和“<拨号网络连接名>”是区分大小写的。 但由于上述命令仅启动拨号窗口而未立即开始拨号,因此在程序中使用时还应再送出模拟“回车”的按键:ret = Shell("rundll32.exe rnaui.dll,RnaDial " + 连接名, 1) SendKeys "{enter}", True
方法1B:使用wininet.dll wininet.dll是微软的Internet扩充函数集,一般在“\Windows\System”目录下。其中的InternetAutodial、InternetAutodialHangup和InternetGetConnectedState三个函数分别可完成自动拨号、自动挂断和判断在线状态等任务。InternetAutodial的定义为:Private Declare Function InternetAutodial Lib "wininet.dll" _ (ByValdwFlags As Long, ByValdwReserved As Long) As Long 若将第一个参数(dwFlags)的值设为2,该函数无需用户干预就可自动拨号。但使用该函数有一个前提:即必须将“Internet 属性”->“连接”设成“始终拨打默认连接”(见下图)。用InternetAutodial函数自动拨号的情况可参见下图。从图中可以看出,该方法可自动重试多次。具体的重试次数在默认连接的“设置”->“高级”中定义:
Public hRasConn As Long '定义一个指向RAS调用的全局句柄 Public Const RAS95_MaxPhoneNumber = 128 Public Const RAS95_MaxEntryName = 256 Public Const RAS95_MaxCallbackNumber = RAS95_MaxPhoneNumber Public Const RAS95_MaxDeviceType = 16 Public Const RAS95_MaxDeviceName = 128 Public Const RAS95_RasConnSize = 412 Public Type RASDIALPARAMS dwSize As Long szEntryName(RAS95_MaxEntryName) As Byte szPhoneNumber(RAS95_MaxPhoneNumber) As Byte szCallbackNumber(RAS95_MaxCallbackNumber) As Byte szUserName(UNLEN) As Byte szPassword(PWLEN) As Byte szDomain(DNLEN) As Byte End TypePublic Type RasConn dwSize As Long hRasConn As Long szEntryName(RAS95_MaxEntryName) As Byte szDeviceType(RAS95_MaxDeviceType) As Byte szDeviceName(RAS95_MaxDeviceName) As Byte End TypePublic Type RASCONNSTATUS dwSize As Long RasConnState As Long dwError As Long szDeviceType(RAS95_MaxDeviceType) As Byte szDeviceName(RAS95_MaxDeviceName) As Byte End TypePublic Type RASENTRYNAME95 'set dwsize to 264 dwSize As Long szEntryName(RAS95_MaxEntryName) As Byte End Type Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, ByVal lpString2 As String) As Long Public Declare Function RasDial Lib "rasapi32.dll" Alias "RasDialA" (lprasdialextensions As Any, ByVal lpszPhonebook As String, lprasdialparams As Any, ByVal dwNotifierType As Long, lpvNotifier As Long, lphrasconn As Long) As Long Public Declare Function RasHangUp Lib "rasapi32.dll" Alias "RasHangUpA" (ByVal hRasConn As Long) As Long Public Declare Function RasEnumEntries Lib "rasapi32.dll" Alias "RasEnumEntriesA" (ByVal reserved As String, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long Public Declare Function RasGetEntryDialParams Lib "rasapi32.dll" Alias "RasGetEntryDialParamsA" (ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByRef lpbool As Long) As Long Public Declare Function RasEnumConnections Lib "rasapi32.dll" Alias "RasEnumConnectionsA" (lpRasConn As Any, lpcb As Long, lpcConnections As Long) As Long Public Declare Function RasGetConnectStatus Lib "rasapi32.dll" Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, lpStatus As Any) As LongPublic Function Dial(ByVal Connection As String, ByVal UserName As String, ByVal Password As String) As Boolean Dim rp As RASDIALPARAMS, h As Long, resp As Long rp.dwSize = Len(rp) + 6 ChangeBytes Connection, rp.szEntryName ChangeBytes "", rp.szPhoneNumber ChangeBytes "*", rp.szCallbackNumber ChangeBytes UserName, rp.szUserName ChangeBytes Password, rp.szPassword ChangeBytes "*", rp.szDomain End FunctionPublic Function ChangeBytes(ByVal str As String, Bytes() As Byte) As Boolean 'Changes a Visual Basic unicode string to an byte array 'Returns True if it truncates str Dim lenBs As Long 'length of the byte array Dim lenStr As Long 'length of the string lenBs = UBound(Bytes) - LBound(Bytes) lenStr = LenB(StrConv(str, vbFromUnicode)) If lenBs > lenStr Then CopyMemory Bytes(0), str, lenStr ZeroMemory Bytes(lenStr), lenBs - lenStr ElseIf lenBs = lenStr Then CopyMemory Bytes(0), str, lenStr Else CopyMemory Bytes(0), str, lenBs 'Queda truncado ChangeBytes = True End If End Function
Public Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long
------------------------------------
Dim lResult As Long
lResult = InternetAutodial(Internet_Autodial_Force_Unattended, 0&)
'"MyConnectionsName" is the name under the icon in Dial-up Networking
X = Shell("rundll32.exe rnaui.dll,RnaDial " & "MyConnectionsName", 1)
DoEvents
'You can type in your password before the { below.
SendKeys "{enter}", True
DoEvents
'End Sub
用VB实现自动上网提取信息(3)[ 作者: 马文骞 添加时间: 2001-8-21 9:26:00 ]
Next
Case "http://my.stockstar.com/scripts/mystockstar.dll?login"
' 当用户登录完成后,准备打开表格的第一页
WebBrowser1.Navigate "http://finance.stockstar.com/scripts/finance.dll?" + _
"showstkdfpm&begin=0&ret=1&index=2&concode=01"
Page = 1
Case Else ' 当进入数据页面(表格的第一页至最后一页)时执行以下程序
Set Tables = WebBrowser1.Document.getElementsByTagName("Table")
For Each Table1 In Tables
If Left(Table1.innerText, 2) = "名次" Then ' 找到需要的Table
' 将表格转换成“.csv”格式
For i = 1 To Table1.rows.length - 1
Set Row = Table1.rows(i)
j = 0
For Each Cell In Row.cells
Text1 = Text1 + Trim(Row.cells(j).innerText) + ","
j = j + 1
Next
Text1 = Left(Text1, Len(Text1) - 1) + vbCrLf
Next
' 数据存盘
Open "C:\Data.csv" For Append As #1
Print #1, Left(Text1, Len(Text1) - 2): Text1 = "": Close #1
Exit For
End If
Next
' 准备打开下一页
Page = Page + 1
tmp = "http://finance.stockstar.com/scripts/finance.dll?showstkdfpm&ret=" + _
Trim(Str(Page)) + "&index=2&concode=01"
If Page <= 54 Then ' 判断是否浏览结束
WebBrowser1.Navigate tmp
Else
' 上网任务完成后,应在此调用自动挂断过程。
Form1.MousePointer = 0
MsgBox "Finished!!": End
End If
End Select
End Sub 以下给出的是上述程序所存数据文件的片段:1,乐凯胶片,600135,材料,81.493,18.445,23.165,8.850,20.717,10.315
2,歌华有线,600037,传播娱乐,80.553,13.009,22.256,12.141,20.304,12.844
3,外运发展,600270,仓储运输,80.326,17.331,23.005,8.829,19.900,11.261
4,东方钽业,0962,有色金属,80.312,15.160,22.483,11.648,21.290,9.730
5,双汇发展,0895,食品,79.772,15.428,20.673,11.508,20.235,11.930
6,四川美丰,0731,化肥,79.361,15.795,23.235,11.323,16.921,12.088
... ... ...
1059,轮胎橡胶,600623,车类,7.167,8.265,10.973,-34.411,14.120,8.219
1060,PT吉轻工,0546,日用轻工产品,-11.895,5.740,-49.149,7.999,14.136,9.379
1061,广船国际,600685,机械仪器,-57.452,9.824,-1.528,-89.648,14.366,9.533 第三部分 自动拨号、自动挂断以及自动处理中途掉线
一个出色的“自动上网机器人”程序应能按照既定的时间准时开始拨号、并当所需任务已完成后立即挂断。而且仅做到这些还不够,它还应在发出拨号指令后跟踪拨号操作是否真的成功、上网速度如何、是否需要挂断后重新拨号、自动浏览过程中是否出现掉线、以及最终的挂断操作是否真的成功完成,等等。 因此,“机器人”程序应定时检查在线状况,以保证浏览时一定在在线状态、浏览完毕后一定不在在线状态。同时还要检查浏览进度,当浏览速度过慢时尝试挂断后重新拨号。 本部分讨论了实现“自动拨号”、“检查在线状况”、以及“自动挂断”这三个功能的若干方法,比较了诸方法各自的优劣,并总结给出了使用建议。本部分的示例程序将这三个功能的诸方法集成在一起,以便于大家对比使用(见下图)。1. 自动拨号
方法1A:使用rnaui.dll rnaui.dll是微软的“拨号网络用户接口”程序集,一般在“\Windows\System”目录下。其中的RnaDial程序用于启动拨号。该程序可在命令行执行(在“开始”->“运行”中键入): rundll32.exe rnaui.dll,RnaDial <拨号网络连接名> 其中的“RnaDial”和“<拨号网络连接名>”是区分大小写的。 但由于上述命令仅启动拨号窗口而未立即开始拨号,因此在程序中使用时还应再送出模拟“回车”的按键:ret = Shell("rundll32.exe rnaui.dll,RnaDial " + 连接名, 1)
SendKeys "{enter}", True
(ByValdwFlags As Long, ByValdwReserved As Long) As Long 若将第一个参数(dwFlags)的值设为2,该函数无需用户干预就可自动拨号。但使用该函数有一个前提:即必须将“Internet 属性”->“连接”设成“始终拨打默认连接”(见下图)。用InternetAutodial函数自动拨号的情况可参见下图。从图中可以看出,该方法可自动重试多次。具体的重试次数在默认连接的“设置”->“高级”中定义:
Public Const RAS95_MaxPhoneNumber = 128
Public Const RAS95_MaxEntryName = 256
Public Const RAS95_MaxCallbackNumber = RAS95_MaxPhoneNumber
Public Const RAS95_MaxDeviceType = 16
Public Const RAS95_MaxDeviceName = 128
Public Const RAS95_RasConnSize = 412
Public Type RASDIALPARAMS
dwSize As Long
szEntryName(RAS95_MaxEntryName) As Byte
szPhoneNumber(RAS95_MaxPhoneNumber) As Byte
szCallbackNumber(RAS95_MaxCallbackNumber) As Byte
szUserName(UNLEN) As Byte
szPassword(PWLEN) As Byte
szDomain(DNLEN) As Byte
End TypePublic Type RasConn
dwSize As Long
hRasConn As Long
szEntryName(RAS95_MaxEntryName) As Byte
szDeviceType(RAS95_MaxDeviceType) As Byte
szDeviceName(RAS95_MaxDeviceName) As Byte
End TypePublic Type RASCONNSTATUS
dwSize As Long
RasConnState As Long
dwError As Long
szDeviceType(RAS95_MaxDeviceType) As Byte
szDeviceName(RAS95_MaxDeviceName) As Byte
End TypePublic Type RASENTRYNAME95
'set dwsize to 264
dwSize As Long
szEntryName(RAS95_MaxEntryName) As Byte
End Type
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, ByVal lpString2 As String) As Long
Public Declare Function RasDial Lib "rasapi32.dll" Alias "RasDialA" (lprasdialextensions As Any, ByVal lpszPhonebook As String, lprasdialparams As Any, ByVal dwNotifierType As Long, lpvNotifier As Long, lphrasconn As Long) As Long
Public Declare Function RasHangUp Lib "rasapi32.dll" Alias "RasHangUpA" (ByVal hRasConn As Long) As Long
Public Declare Function RasEnumEntries Lib "rasapi32.dll" Alias "RasEnumEntriesA" (ByVal reserved As String, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long
Public Declare Function RasGetEntryDialParams Lib "rasapi32.dll" Alias "RasGetEntryDialParamsA" (ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByRef lpbool As Long) As Long
Public Declare Function RasEnumConnections Lib "rasapi32.dll" Alias "RasEnumConnectionsA" (lpRasConn As Any, lpcb As Long, lpcConnections As Long) As Long
Public Declare Function RasGetConnectStatus Lib "rasapi32.dll" Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, lpStatus As Any) As LongPublic Function Dial(ByVal Connection As String, ByVal UserName As String, ByVal Password As String) As Boolean
Dim rp As RASDIALPARAMS, h As Long, resp As Long
rp.dwSize = Len(rp) + 6
ChangeBytes Connection, rp.szEntryName
ChangeBytes "", rp.szPhoneNumber
ChangeBytes "*", rp.szCallbackNumber
ChangeBytes UserName, rp.szUserName
ChangeBytes Password, rp.szPassword
ChangeBytes "*", rp.szDomain
End FunctionPublic Function ChangeBytes(ByVal str As String, Bytes() As Byte) As Boolean
'Changes a Visual Basic unicode string to an byte array
'Returns True if it truncates str
Dim lenBs As Long 'length of the byte array
Dim lenStr As Long 'length of the string
lenBs = UBound(Bytes) - LBound(Bytes)
lenStr = LenB(StrConv(str, vbFromUnicode))
If lenBs > lenStr Then
CopyMemory Bytes(0), str, lenStr
ZeroMemory Bytes(lenStr), lenBs - lenStr
ElseIf lenBs = lenStr Then
CopyMemory Bytes(0), str, lenStr
Else
CopyMemory Bytes(0), str, lenBs 'Queda truncado
ChangeBytes = True
End If
End Function