本帖最后由 republican 于 2010-9-22 09:51 编辑
本BUG在08 R2(64Bit)系统下100%重现。
出错涉及UDF, _POP3.AU3.
出错猜想: 无法 Handle 包含特殊字符串的 变量。
出错涉及过程:(出错代码在第36行)
Func _Pop3Top($msg, $nb)
ConsoleWrite($msg &"--------0"&@CRLF )
If $pop3_IsAuth = 1 Then
Local $ret
; Send Top
$ret = TCPSend ($pop3_socket, "TOP " & $msg & " " & $nb & @CRLF)
If @error Then
SetError($pop3_error_top_refused)
Return -1
EndIf
$ret = _Pop3WaitForOK()
If @error Then
SetError($pop3_error_no_OK_response)
Return -1
EndIf
$ret = _WaitTcpResponse()
If @error Then
SetError($pop3_error_no_TCP_response)
Return -1
EndIf
ConsoleWrite($msg &"--------1"&@CRLF )
; Downloading until final dot and cariage return.
While Not StringRegExp($ret, "\r\n\.\r\n")
$ret = $ret & _WaitTcpResponse()
If @error Then
SetError($pop3_error_no_TCP_response)
Return -1
EndIf
WEnd
ConsoleWrite($msg &"--------OK"&@CRLF )
MsgBox(0,"",$ret)
Return $ret
Else
SetError($pop3_error_no_auth)
Return -1
EndIf
EndFunc ;==>_Pop3Top
函数调用过程:
For $i = 1 To $uidl[0]
$Temp=StringRegExp($uidl[$i],'(\d+) (.*)',3)
If UBound($Temp) = 2 Then
$MyUID[$i][0]=$Temp[0]
$MyUID[$i][1]=$Temp[1]
Else
$MyUID[$i][0]=$i
$MyUID[$i][1]="ERROR"
EndIf
Next
$MyUID[0][0]="0"
$MyUID[0][1]=$uidl[0]
;~ IniWriteSection("MailDB.ini","UID",$MyUID,0)
$WebMailUIDX=IniReadSection("MailDBOld.ini","UID")
_ArrayDelete($WebMailUIDX, 1)
$Test= _MyArrayContrast($MyUID,$WebMailUIDX)
If $Test[0] <> -1 And $Test[4] <> 0 Then
MsgBox(0,"提示","您有"&$Test[4]&"封新邮件!")
For $i = $uidl[0] To $uidl[0]-$Test[4]+1 Step -1
$muti = _Pop3Top ($i, 1)
MsgBox(0,"标题为",_MailDecode($muti))
Next
EndIf
出错及排除过程;
1. 出错过程在 Return 一句。
2.到底是不是呢?测试一下,注销此句,结果没事了。
3.直接return不行,试试用二进制吧。好的,没问题。
4.我要的字符串,二进制可不行,转回字符串吧,结果再次出错了。
以上,我想说明的是,AU3可能无法 Handle 此字符串。
程序打包,用户名及密码已被删除,如果您是测试者,请PM我.
本问题应该在NT6 64bit 的系统下都能重现,在32bit系统下则随机出现,非常恼人。 |