本帖最后由 waxy 于 2010-4-27 10:50 编辑
非常感谢sensel 针对“时间同步问题”的解答,我再次把他的原码贴出跟大家一起分享一下。不过在作一些完善时遇到一点小问题,大家帮忙看看。
一个关于“判断循环”的问题(这方面的知识我一直都没有完全掌握),大家都知道,网络都可能出现网线没连好或其它问题造成时间同步不了的情况
于是我就想加一个判断语句,出现同步失败即提示再来一次,直到OK为止,点“取消”则退出程序。我尝试的改了一下,可是没成功。不知道IF语句
里面有没有办法嵌入类似ContinueLoop来实现循环。谢谢!#include <Date.au3>
Opt("MustDeclareVars", 1)
Opt("TrayAutoPause", 0)
Opt("TrayIconDebug", 1)
Global $pass , $fail
Local $sServer = "192.168.0.1"
If TimeSync($sServer) Then
$pass=MsgBox(0x40, "提示", "与服务器 " & $sServer & " 时间同步成功。" & @CRLF & "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()))
Else
$fail=MsgBox(5+48, "错误", "与服务器 " & $sServer & " 时间同步失败!" & @CRLF & "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()))
If $fail=4 Then
;ContinueLoop 这个地方试好多方法,没办法写下去了。
EndIf
Exit
Func TimeSync($sServer)
Local $tSystemTime
If Ping($sServer, 250) = 0 Then Return 0
$tSystemTime = _NetRemoteTOD($sServer)
If @error Then Return 0
If _Date_Time_SetSystemTime(DllStructGetPtr($tSystemTime)) Then
Return 1
Else
Return 0
EndIf
EndFunc ;==>TimeSync
;===============================================================================
; 说明: 获取以 UTC 表示的指定服务器日期和时间信息
; 语法: _NetRemoteTOD($sServer)
; 参数: $sServer - 计算机名称
; 需要: <Date.au3>
; 返回: 成功 - 包含服务器日期和时间的 $tagSYSTEMTIME 结构体
; 失败 - 0, 并设置 @error
; 备注: @@MsdnLink@@ NetRemoteTOD
;===============================================================================
Func _NetRemoteTOD($sServer)
Local $aResult, $tTIME_OF_DAY_INFO, $tSYSTEMTIME
Local Const $tagTIME_OF_DAY_INFO = _
"dword tod_elapsedt;dword tod_msecs;" & _
"dword tod_hours;dword tod_mins;" & _
"dword tod_secs;dword tod_hunds;" & _
"long tod_timezone;dword tod_tinterval;" & _
"dword tod_day;dword tod_month;" & _
"dword tod_year;dword tod_weekday"
$aResult = DllCall("netapi32.dll", "int", "NetRemoteTOD", "wstr", $sServer, "ptr*", 0)
If @error Then Return SetError(@error, 0, 0)
If $aResult[0] <> 0 Then Return SetError($aResult[0], 0, 0)
$tTIME_OF_DAY_INFO = DllStructCreate($tagTIME_OF_DAY_INFO, $aResult[2])
$tSYSTEMTIME = _Date_Time_EncodeSystemTime( _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_month"), _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_day"), _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_year"), _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_hours"), _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_mins"), _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_secs"), _
DllStructGetData($tTIME_OF_DAY_INFO, "tod_hunds") * 10)
DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", $aResult[2])
Return $tSYSTEMTIME
EndFunc ;==>_NetRemoteTOD
|