opq6789 发表于 2015-7-19 15:57:49

今天被_SetTime函数害死了

一直有个不好的习惯,UDF里面的函数一般都直接拿来使用,从来懒的去review一下里面的代码,总觉得既然能收录进UDF肯定是经过大量实际使用的。

好了,今天的情况是我写了一个程序,希望23:59:55自动执行一些任务,操作的时候需要处理对方一个类似客户端的程序,里面有服务器的实时时间显示,为了让时间更加精准,我实时从对方的客户端中获取时间,然后通过_SetTime函数同步到本地,if判断语句中通过判断 @houe @min @sec 的值来决定什么时候执行程序,结果意外发生了,23:59:00的时候程序竟然自动执行了,我查看日志,这个时间点电脑的时间竟然是被同步成了 23:59:59,查了N多问题,终于发现问题发生在_SetTime里面:

        DllStructSetData($tSystemTime, 5, $iHour)
        DllStructSetData($tSystemTime, 6, $iMinute)
        If $iSecond > 0 Then DllStructSetData($tSystemTime, 7, $iSecond)

上面是_SetTime函数的代码,如果秒是00,竟然不做处理,我fuck。。。。

也就是说上一秒把本地时间同步成了 23:58:59,当客户端的时间显示 23:59:00的时候,本来也希望将本地时间通过_SetTime函数同步成23:59:00,结果_SetTime函数不处理00秒,只把小时和分钟设置到系统时间,就变成了悲剧的 23:59:59,导致程序自动运行了。。。

哎。。。写这个出来提醒下大家这里有个坑。。。

make2855 发表于 2015-7-19 16:26:45

au3 是免费的,作者维护的精力有限。本来就是当小脚本来用,做高大上的程序当然不适合。

masterpcc 发表于 2015-7-19 17:12:40

非常感谢 学习了

卓越科技 发表于 2015-7-19 17:31:23

非常感谢 学习了

Alam 发表于 2015-7-19 18:24:10

很好奇怎么个“死法”,可惜1楼没讲出来啊。

Alam 发表于 2015-7-19 18:24:13

很好奇怎么个“死法”,可惜1楼没讲出来啊。

fcurrk 发表于 2015-7-20 11:12:16

没看出什么严重性来,呵呵

hnfeng 发表于 2015-7-20 11:54:08

谢谢提醒,近日我也遇到UDF兼容性问题
http://www.autoitx.com/thread-48822-1-1.html

haijie1223 发表于 2015-7-20 16:57:45

确实如此,不知为什么要做大于0的判断,可将
If $iSecond > 0 Then DllStructSetData($tSystemTime, 7, $iSecond)直接改为DllStructSetData($tSystemTime, 7, $iSecond)

opq6789 发表于 2015-7-21 13:55:22

回复 9# haijie1223

我自己通过逻辑处理了这个问题,至于原来UDF中为什么这么写,我想作者之前一定有他的理由吧。。。没时间去研究也就没直接改UDF

nqawen 发表于 2015-7-26 11:19:22

谢谢学习了。。。。。。。。。。。。。。。

ddrs 发表于 2015-8-14 00:53:19

看出什么严重性来,呵呵
页: [1]
查看完整版本: 今天被_SetTime函数害死了