我有一段是自动登陆网站的代码,运行初期就正常,但长时间运行,到时间登陆时就会出现:[运行时错误'91':未设置对象变量或with block变量]错误就退出了,麻烦各位高手帮忙检查一下哪里出错?

解决方案 »

  1.   

    晕,不会上传附件,代码如下:Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Const WM_SYSCOMMAND = &H112
    Private Const SC_RESTORE = &HF120&Private LastState As Integer '保留原窗口状态'---------- dwMessage可以是以下NIM_ADD、NIM_DELETE、NIM_MODIFY 标识符之一----------
    Private Const NIM_ADD = &H0 '在任务栏中增加一个图标
    Private Const NIM_DELETE = &H2 '删除任务栏中的一个图标
    Private Const NIM_MODIFY = &H1 '修改任务栏中个图标信息Private Const NIF_MESSAGE = &H1 'NOTIFYICONDATA结构中uFlags的控制信息
    Private Const NIF_ICON = &H2
    Private Const NIF_TIP = &H4Private Const WM_MOUSEMOVE = &H200 '当鼠标指针移至图标上Private Const WM_LBUTTONUP = &H202
    Private Const WM_RBUTTONUP = &H205Private Type NOTIFYICONDATA
    cbSize As Long '该数据结构的大小
    hwnd As Long '处理任务栏中图标的窗口句柄
    uID As Long '定义的任务栏中图标的标识
    uFlags As Long '任务栏图标功能控制,可以是以下值的组合(一般全包括)
    'NIF_MESSAGE 表示发送控制消息;
    'NIF_ICON表示显示控制栏中的图标;
    'NIF_TIP表示任务栏中的图标有动态提示。
    uCallbackMessage As Long '任务栏图标通过它与用户程序交换消息,处理该消息的窗口由hWnd决定
    hIcon As Long '任务栏中的图标的控制句柄
    szTip As String * 64 '图标的提示信息
    End TypeDim myData As NOTIFYICONDATAPrivate Sub Form_Load()
    Me.Visible = False  '隐藏窗口
    '************************************************** '添加系统托盘图标
    With myData
    .cbSize = Len(myData)
    .hwnd = Me.hwnd
    .uID = 0
    .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
    .uCallbackMessage = WM_MOUSEMOVE
    .hIcon = Me.Icon.Handle '默认为窗口图标
    .szTip = "自动登陆" & vbNullChar
    End WithShell_NotifyIcon NIM_ADD, myData
    End Sub
    Private Sub Form_Unload(Cancel As Integer) '窗体卸载事件
    Shell_NotifyIcon NIM_DELETE, myData '窗口卸载时,将状态栏中的图标一同卸载
    End Sub
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '***********************
    Select Case CLng(X)
    Case WM_RBUTTONUP '鼠标在图标上右击时弹出菜单
    'Me.PopupMenu mnuTray
    PopupMenu rightMenu
    'MsgBox "右击鼠标", , "信息"
    'Case WM_LBUTTONUP '鼠标在图标上左击时窗口若最小化则恢复窗口位置
    'Me.Visible = Not Me.Visible
    'MsgBox "左击鼠标", , "信息"
    End Select
    End Sub
    Private Sub exit_Click()
        frmLogin.Show
        
    End Sub
    Private Sub about_Click()
        frmAbout.Show
        
    End Sub
    Private Sub mnuFile_Click()End SubPrivate Sub Timer1_Timer()
     
              If Format(Time, "hh:mm") = "07:45" Or Format(Time, "hh:mm") = "13:15" Then
                 Call Timer1_Load
                 
              Else
              End If
      End SubPublic Sub Timer1_Load()
    WebBrowser1.Navigate "http://192.168.1.9/index.jsp"
    End Sub
    Private Sub WebBrowser1_DownloadComplete()
    Dim vDoc, vTag
    Dim i As Integer
    Set vDoc = WebBrowser1.Document
    For i = 0 To vDoc.All.length - 1 '检测所有标签
       If UCase(vDoc.All(i).tagName) = "INPUT" Then '找到input标签
         Set vTag = vDoc.All(i)
         If vTag.Type = "text" Then '检测类型
            Select Case vTag.Name
               Case "userid" '填写用户名的文本框的值
                  vTag.Value = "abc"
            End Select
         End If    If vTag.Type = "password" Then        '检测密码框类型
           Select Case vTag.Name
               Case "password"                  '密码框的值
                vTag.Value = "1234"
           End Select
        End If
    zt = WebBrowser1.Document.All
    Set re = CreateObject("VBScript.RegExp")re.Pattern = "\<STRONG>.*</STRONG>"
    Set Matches = re.Execute(UCase(zt.innerHTML))
    For Each match In Matches
       vv = Mid(match.Value, 9, Len(match.Value) - 17)
    Next
    checknum = WebBrowser1.Document.getElementsByName("checknum")
    checknum.Value = vv   If vTag.Name = "login" Then
        vTag.Click
      End IfEnd If
    Next i
    End Sub
      

  2.   

    你的Timer1_Timer()中,只要当前时间为07:45或13:15就调用Timer1_Load(),而整个60秒内可能会又多次Timer1_Timer()事件发生,那么会产生这种可能:
    前一个Timer1_Load()后刷新网页,产生了WebBrowser1_DownloadComplete()事件,处理途中……
    又一个Timer1_Timer()发生调用Timer1_Load()刷新网页,那么WebBrowser1.Document的成员就不完整了……
    调用堆栈恢复到WebBrowser1_DownloadComplete()处理过程,那么这时你要访问WebBrowser1.Document中的成员就可能不存在了。所以你在 Timer1_Timer() 中要纪录上次的 hh:mm 是什么值,如果与当前一样,那么就不做任何处理,这样才保证初次到达07:45或13:15时只刷新一次网页。又:Form_MouseMove() 处理得莫名奇妙,X 是坐标值而不是 WM_* 。
      

  3.   

    那么13:15以前重新关闭、打开程序,有没有错?在 VB-IDE 的选项“General\Error Trapping”中选择“Break on All Errors”,先定位一下哪句语句发生错误。
      

  4.   

    那么在任务管理器中,将以下几列都选上:内存使用、虚拟内存、句柄数、线程数、GDI 对象。
    将程序在以下几个场景下的运行状态比较一下:初始运行、第一次到时、长时间运行、第二次到时。
    至少后三个场景下各个计数器应该是比较接近的。
      

  5.   

    我估计是这段代码出错,这段是取得网页的验证码,然后自动填写验证码的.但不知错在哪里?
    zt = WebBrowser1.Document.All
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "\<STRONG>.*</STRONG>"
    Set Matches = re.Execute(UCase(zt.innerHTML))
    For Each match In Matches
       vv = Mid(match.Value, 9, Len(match.Value) - 17)
    Next
    checknum = WebBrowser1.Document.getElementsByName("checknum")
    checknum.Value = vv
      

  6.   

    你说的"任务管理器"只指Windows的任务管理器吗,就是用Ctrl+Alt+Delete 调出的那个?怎么我调出任务管理器后找不到内存使用、虚拟内存、句柄数、线程数、GDI 对象这几个选项的?