fuinei 发表于 2011-10-9 12:05:08

Autoit编译后的程序部分计算机无法正常结束

各位好,我使用AUTOIT_3.3.6.1-2编辑了一个小程序在部分计算机(不是全部)会出现可以执行但进程无法正常结束的情况,请问有哪位遇到过类似的情况呢?

fuinei 发表于 2011-10-9 12:27:43

已使用AUTOIT_3.3.7.15.1重新编译,情况相同

gzh888666 发表于 2011-10-9 12:54:34

无源码,无真相!源码上来!

李白vs苏轼 发表于 2011-10-9 15:11:01

给源码吧,肯定没有退出循环了

jj119120 发表于 2011-10-9 16:00:54

可能是编写错误

fuinei 发表于 2011-10-9 20:16:35

本帖最后由 fuinei 于 2011-10-9 21:48 编辑

有问题部分代码如下:(省略了发送邮件部分的代码,使用下面的代码在有问题的计算机会导致程序无法结束)
Local $msg = ObjCreate ("JMail.Message")                                                                                                  
$msg.Charset = "gb2312"                                                                                                                          
TCPStartup()                                                      
$socket = TCPConnect("10.254.23.173", 23)
Sleep("1000")
$ack = TCPRecv($socket, 250)
If StringInStr($ack,"Username:")==0 Then
      TCPCloseSocket($socket)      
      TCPShutdown()
      MsgBox(0,"info","error!")
      Exit
Endif
测试时发现当创建Jmail对象并且使用TCPshutdown()函数就会导致程序无法正常结束。
上述代码如不调用Jamil对象和去掉TCPshutdown()函数在有问题的计算机均可正常执行,请问如何可以调用Jmail发送邮件并且也能使用TCPshutdown()函数呢?
注:Jmail 4.4和4.5都测试过有相同的问题

fuinei 发表于 2011-10-10 11:37:09

请问哪位知道如何解决呢?

xms77 发表于 2011-10-10 22:29:30

本帖最后由 xms77 于 2011-10-10 22:32 编辑

可能是TCPConnect()没有成功,但是却执行了TCPCloseSocket()函数,会出现非正常退出

fuinei 发表于 2011-10-10 23:28:48

本帖最后由 fuinei 于 2011-10-10 23:30 编辑

TCPconnect()是成功的,整个程序最终也可以正常发出含结果的邮件。

fuinei 发表于 2011-10-10 23:28:59

本帖最后由 fuinei 于 2011-10-10 23:32 编辑

使用CDO.message发送邮件也是一样,程序也是无法结束。

fuinei 发表于 2011-10-10 23:29:21

本帖最后由 fuinei 于 2011-10-10 23:33 编辑

只要发送有发送邮件的代码与存在TCPshutdown()函数就会导致这个问题,真奇怪。
不知道Autoit有没有debug的工具可实时查看程序执行的情况呢?

fuinei 发表于 2011-10-11 12:22:13

本帖最后由 fuinei 于 2011-10-11 12:48 编辑

经多次调试发现有问题的计算机只要发送邮件(不管使用Jmail还是cdonts)都会导致程序无法程序,代码如下:
Jamil代码如下:
Local $msg = ObjCreate ("JMail.Message")                                       
$msg.Charset = "gb2312"                                               
$msg.Silent = true
$msg.Priority = 3       
$msg.From = "abc@abc.com"
$msg.FromName = "abc"         
$msg.AddRecipient("abc@abc.com", "abc")   
$msg.Subject = "test"
$msg.Body="test"
$msg.Send("mail.abc.com")

fuinei 发表于 2011-10-11 12:47:48

补充一下使用下面的代码在无法结束情况的计算机会弹出邮件发送成功的提示窗口。
Local $msg = ObjCreate ("JMail.Message")                                       
$msg.Charset = "gb2312"                                                
$msg.Silent = true
$msg.Priority = 3      
$msg.From = "abc@abc.com"
$msg.FromName = "abc"         
$msg.AddRecipient("abc@abc.com", "abc")   
$msg.Subject = "test"
$msg.Body="test"
If $msg.Send("mail.abc.com") Then
        MsgBox(0,"info","邮件发送成功")
Else
        MsgBox(0,"info","邮件发送失败")
EndIf
$msg = ""

xrzmjz 发表于 2011-10-14 11:09:02

第一段代码的问题出在If StringInStr($ack,"Username:")==0 Then这条语句上
==的含义是判断两个字符串是否相等.左方和右方的值将会转化成字符串
而这个运算符只能用于区分字符串大小写的比较
但StringInStr($ack,"Username:")的含义是检测$ack中是否含有Username:这一字符串
不论是否含有这个字符串,返回的结果都是数字,也就是第一个字符串的位置或0
这样这个条件永远不会满足,也就不可能执行后面的关闭TCP套接字和退出程序了
只要把==修改为=就行了

zkjlcj911 发表于 2011-10-14 22:51:49

是不是被杀软拦截了?
页: [1] 2
查看完整版本: Autoit编译后的程序部分计算机无法正常结束