请问具体是什么异常啊?
它报异常,都有一个错误号的,你要把错误号说一下啊,要不然,我怎么去猜呢。还有,既然在IDE下也会出异常,那就更好了呀。
它报异常时,点“调试”,这样它就在出错的那一句上中断。
你说下是哪句,
如果是进行运算的语句,那这句中出错时,相关的几个变量值是多少说下。要找清楚原因,才好“对症下药”呀。
它报异常,都有一个错误号的,你要把错误号说一下啊,要不然,我怎么去猜呢。还有,既然在IDE下也会出异常,那就更好了呀。
它报异常时,点“调试”,这样它就在出错的那一句上中断。
你说下是哪句,
如果是进行运算的语句,那这句中出错时,相关的几个变量值是多少说下。要找清楚原因,才好“对症下药”呀。
点击停止调试后,整个VB运行环境被强行关掉退出。
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
===================================================================
即使加了错误异常处理,没有效果。
因为这算法本身没有出现“异常”的条件,所以 On Error不会生效。既然是访问冲突,这个应该跟传入的 buffer() 关系比较大。
请问,你用到的这个“buffer() ”所使用的内存区,是由什么方式取得的?
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
======================================
这是调用该算法的,过程,帮我看看是否有问题。
⑴ 你就直接说说,你的程序中用到的“数据缓冲区”,是否都是由你自己的代码中分配后,再使用?
⑵ 你的代码中分配的数据缓冲区,有传给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
...
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
谁会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;
}
疑似内存泄漏。仔细考察一下你的 Buffer 的运行状态。
这个好象是从 WinSock接收的数据?
为什么开始用的是 Variant 类型,而不是直接用Byte数组呢?