请问具体是什么异常啊?
它报异常,都有一个错误号的,你要把错误号说一下啊,要不然,我怎么去猜呢。还有,既然在IDE下也会出异常,那就更好了呀。
它报异常时,点“调试”,这样它就在出错的那一句上中断。
你说下是哪句,
如果是进行运算的语句,那这句中出错时,相关的几个变量值是多少说下。要找清楚原因,才好“对症下药”呀。

解决方案 »

  1.   

    好像是内存读取冲突,引起的异常。出此错误时,无法跟踪代码,点击继续,没有响应。点击中断,是弹出一引起汇编信息(如0x41414159等信息)。
    点击停止调试后,整个VB运行环境被强行关掉退出。
      

  2.   

    ''省标解密算法
    Public Function Encrypt(ByRef buffer() As Byte, ByVal size As Long, ByRef B() As Byte) As Integer
    On Error GoTo Err
      Const M1  As Long = &HFAFAFAFA
      Const IA1 As Long = &HF7F7F7F7
      Const IC1 As Long = &HF5F5F5F5
      Dim idx As Integer
      Dim key As Long
      Dim dVm As Double
      Dim dVc As Double
      Dim dTa As Double
      Dim MULP As Double
      
       Encrypt = 0
       
       ReDim B(size) As Byte
       key = &H4D2
       
       dVm = ConvToULONG(M1): If dVm = 1 Then Exit Function
       dVc = ConvToULONG(IC1): If dVc = 1 Then Exit Function
       For idx = 0 To size
          dTa = ConvToULONG(key): If dTa = 1 Then Exit Function
          key = ConvToLong(dTa - dVm * Fix(dTa / dVm)): If key = 1 Then Exit Function
          MULP = OverflowMULP(key, IA1): If MULP = 1 Then Exit Function
          key = ConvToLong(MULP + dVc): If key = 1 Then Exit Function
          B(idx) = buffer(idx) Xor (key And &HFF00000) \ 1048576
       Next
       
       Encrypt = 1
       
       Exit Function
    Err:
      Encrypt = 0
    End Function
    Private Function ConvToULONG(ByVal v As Long) As Double
    On Error GoTo Err   If (&H80000000 And v) Then
          ConvToULONG = 4294967296# + v
       Else
          ConvToULONG = v
       End If
       
       Exit Function
    Err:
      ConvToULONG = 1
    End Function
    Private Function ConvToLong(ByVal dv As Double) As Long
    On Error GoTo Err   dv = dv - 4294967296# * Fix(dv / 4294967296#)
       If (dv < 2147483648#) Then
          ConvToLong = dv
       Else
          ConvToLong = dv - 4294967296#
       End If
       
       Exit Function
    Err:
      ConvToLong = 1
    End Function
    Private Function OverflowMULP(ByVal Va As Long, ByVal Vb As Long) As Double
    On Error GoTo Err
       Const HIGHMASK As Long = &HFFFF0000
       Const LOWMASK  As Long = &HFFFF&
       Dim dVaH As Double
       Dim dVaL As Double
       Dim dVbH As Double
       Dim dVbL As Double
       
       dVaH = ConvToULONG(HIGHMASK And Va)
       dVbH = ConvToULONG(HIGHMASK And Vb)
       dVaL = LOWMASK And Va
       dVbL = LOWMASK And Vb
       OverflowMULP = dVaH * dVbL + dVbH * dVaL + dVaL * dVbL
       
      Exit Function
    Err:
      OverflowMULP = 1
    End Function
    ===================================================================
    即使加了错误异常处理,没有效果。
      

  3.   

    我觉得,这个异常应该不是由这段代码算法引起的。
    因为这算法本身没有出现“异常”的条件,所以 On Error不会生效。既然是访问冲突,这个应该跟传入的 buffer() 关系比较大。
    请问,你用到的这个“buffer() ”所使用的内存区,是由什么方式取得的?
      

  4.   

          ''解密
          Dim A(31) As Byte
          Dim B() As Byte
          For i = 0 To 31
            A(i) = RecBuffer(i + 18)
          Next i
          k = Encrypt(A, 31, B)  ''解密
          ''解密异常,退出
          If k = 0 Then Exit Sub
          For i = 0 To 31
            RecBuffer(i + 18) = B(i)
          Next i
    ======================================
    这是调用该算法的,过程,帮我看看是否有问题。
      

  5.   

    这个调用不会有问题。RecBuffer( ) 从何而来?
    ⑴ 你就直接说说,你的程序中用到的“数据缓冲区”,是否都是由你自己的代码中分配后,再使用?
    ⑵ 你的代码中分配的数据缓冲区,有传给API中,让它使用的吧?
      

  6.   

    RecBuffer是Winsock接收的数据,不是传到API。【我仔细查代码,查不出哪里有问题。】
    ''数据处理
    Private Sub WskServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    On Error GoTo Err
      Dim RecBuffer As Variant
      Dim RecBuffer1 As Variant
      Dim Str As String
      Dim i, j As Integer
        
        WskServer(Index).GetData RecBuffer1, vbArray + vbByte
        ActiveSocks(Index).rCount = 1    ''连接记数
        
        ''******省标
        ''终端信息包
        If RecBuffer1(0) = &H7E And RecBuffer1(1) = &H52 Then
          Call ZD_GPSXX_SB(RecBuffer1, Index)
          Exit Sub
        End If
    ...''终端位置信息包(省标)
    Private Sub ZD_GPSXX_SB(ByRef RecBuffer1 As Variant, ByVal Index As Integer)
    On Error GoTo Err
      Dim i, j As Integer
      Dim k  As Integer
      Dim iZCount As Integer
      Dim Buffer1(19) As Byte
      Dim BufferCRC(16) As Byte
      Dim Str As String
      Dim sTime As String
      Dim dSpeed As Double
      Dim sSpeed As String
      Dim sLong, sLat As String
      Dim dLong, dLat As Double
      Dim sFX As String
      Dim dFX As Double
      Dim iDW As Integer
      Dim iGT As Integer
      Dim sLC As String
      Dim iLC As Long
      Dim RecBuffer As Variant
          
        ''******解析数据包
        Str = StrConv(RecBuffer1, vbUnicode)
        Str = Replace(Str, "~", "")
        Str = Replace(Str, vbCrLf, "")
        Str = Trim(Str)
        ''Base64解码
        RecBuffer = DecodeBase64Byte(Str)
        ''反转义
        If CStr(RecBuffer) <> "" Then
          ReDim RecBuffer1(UBound(RecBuffer)) As Byte
          i = 0: j = 0
          Do While i <= UBound(RecBuffer)
            If i < UBound(RecBuffer) Then
              If RecBuffer(i) = &H7D And RecBuffer(i + 1) = &H5D Then
                RecBuffer1(j) = &H7D
                i = i + 1
              ElseIf RecBuffer(i) = &H7D And RecBuffer(i + 1) = &H5E Then
                RecBuffer1(j) = &H7E
                i = i + 1
              ElseIf RecBuffer(i) = &H7D And RecBuffer(i + 1) = &H5F Then
                RecBuffer1(j) = &H7F
                i = i + 1
              Else
                RecBuffer1(j) = RecBuffer(i)
              End If
            Else
              RecBuffer1(j) = RecBuffer(i)
            End If
      
            i = i + 1: j = j + 1
          Loop
          ReDim RecBuffer(j - 1) As Byte
          For i = 0 To j - 1
            RecBuffer(i) = RecBuffer1(i)
          Next i
          ''解密
          Dim A(31) As Byte
          Dim B() As Byte
          For i = 0 To 31
            A(i) = RecBuffer(i + 18)
          Next i
          k = Encrypt(A, 31, B)  ''解密数据
          ''解密异常,退出
          If k = 0 Then Exit Sub
          For i = 0 To 31
            RecBuffer(i + 18) = B(i)
          Next i
        Else
          Exit Sub
        End If
    ...
      

  7.   

    Private Sub logtofile(s As String)
    Dim f As Integer
    On Error Resume Next
        log s
        f = FreeFile()
        Open App.Path + "\MyLog1.LOG" For Append As #f
        Print #f, Format(Now, "YYYY-MM-DD hh:mm:ss") + " " + s
        Close #f
        If FileLen(App.Path + "\MyLog1.LOG") > 50000000 Then
            Kill App.Path + "\MyLog2.LOG"
            Name App.Path + "\MyLog1.LOG" As App.Path + "\MyLog2.LOG"
        End If
    End Sub
      

  8.   

    重新开发时间来不及啊。
    谁会C++的,帮我写一下DLL吧,拜谢!需要写DLL的算法代码:
    public static byte[] dencrypt(byte[] by, int size)
    {    uint M1 = 0xFAFAFAFA;
        uint IA1 = 0xF7F7F7F7;
        uint IC1 = 0xF5F5F5F5;    uint key = 0x000004d2;
        int idx = 0;
        if (key == 0) key = 1;
        byte[] byy = new byte[by.Length];
        while (idx < size)
        {
            key = (uint)IA1 * (key % M1) + IC1;
            uint ms = ((key >> 20) & 0xFF);
            uint sss = (uint)by[idx];
            uint mss = sss ^ ms;
            byy[idx] = (byte)mss;        idx++;
        }
        return byy;
    }
      

  9.   


    疑似内存泄漏。仔细考察一下你的 Buffer 的运行状态。
      

  10.   

    我的看法是,如果你把解决问题的“目标”瞄在我给你的那段VB代码上,很有可能是走错方向了。我感觉你还是好好分析下你的“数据缓冲区”的运作方式和它的状态。
    这个好象是从 WinSock接收的数据?
    为什么开始用的是 Variant 类型,而不是直接用Byte数组呢?