2013年6月14日 星期五

使用SNTP同步時間

適用於 Windows Embedded CE 6.0 / 5.0 / 4.2

1. 確定有連上網路.

2. Registry請先設為,
[HKEY_LOCAL_MACHINE\Services\TIMESVC]
"Dll"="timesvc.dll"
"Order"=dword:99
"Keep"=dword:1
"Prefix"="NTP"
"Index"=dword:0

[HKEY_LOCAL_MACHINE\Services\TIMESVC]
"server"=multi_sz:"tock.usno.navy.mil","time.windows.com"
"AutoUpdate"=dword:1
"ServerRole"=dword:1
"refresh"=dword:48190800
"recoveryrefresh"=dword:1B7740
"threshold"=dword:5265C00
"trustlocalclock"=dword:0

3. Code的寫法,
DWORD dwState = 0;
DWORD dwerr = 0;
WCHAR szControl[]=L"Sync";
DWORD dwLen=sizeof(szControl);
HANDLE hNTP=CreateFile(TEXT("NTP0:"),GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);

if(hNTP == INVALID_HANDLE_VALUE)
{
_tprintf(TEXT("Open fail.\r\n"));
return 1;
}

_tprintf(TEXT("Open success.\r\n"));

if(!DeviceIoControl(hNTP, IOCTL_SERVICE_STOP, NULL, 0, NULL, 0, NULL, NULL))
{
dwerr = GetLastError();
_tprintf(TEXT("Error code is %d\r\n"), dwerr);
}

if(!DeviceIoControl(hNTP, IOCTL_SERVICE_STATUS, NULL, 0, &dwState, sizeof(DWORD), NULL,NULL))
{
dwerr = GetLastError();
_tprintf(TEXT("Error code is %d\r\n"), dwerr);
}

switch(dwState)
{
case 0:
_tprintf(TEXT("SERVICE_STATE_OFF\r\n"));
break;

case 1:
_tprintf(TEXT("SERVICE_STATE_ON\r\n"));
break;

case 2:
_tprintf(TEXT("SERVICE_STATE_STARTING_UP\r\n"));
break;

case 3:
_tprintf(TEXT("SERVICE_STATE_SHUTTING_DOWN\r\n"));
break;

case 4:
_tprintf(TEXT("SERVICE_STATE_UNLOADING\r\n"));
break;

case 5:
_tprintf(TEXT("SERVICE_STATE_UNINITIALIZED\r\n"));
break;

default:
_tprintf(TEXT("SERVICE_STATE_UNKNOWN\r\n"));
}

if(!DeviceIoControl(hNTP, IOCTL_SERVICE_START, NULL, 0, NULL, 0, NULL, NULL))
{
dwerr = GetLastError();
_tprintf(TEXT("Error code is %d\r\n"), dwerr);
}

if(!DeviceIoControl(hNTP, IOCTL_SERVICE_STATUS, NULL, 0, &dwState, sizeof(DWORD), NULL,NULL))
{
dwerr = GetLastError();
_tprintf(TEXT("Error code is %d\r\n"), dwerr);
}

switch(dwState)
{
case 0:
_tprintf(TEXT("SERVICE_STATE_OFF\r\n"));
break;

case 1:
_tprintf(TEXT("SERVICE_STATE_ON\r\n"));
break;

case 2:
_tprintf(TEXT("SERVICE_STATE_STARTING_UP\r\n"));
break;

case 3:
_tprintf(TEXT("SERVICE_STATE_SHUTTING_DOWN\r\n"));
break;

case 4:
_tprintf(TEXT("SERVICE_STATE_UNLOADING\r\n"));
break;

case 5:
_tprintf(TEXT("SERVICE_STATE_UNINITIALIZED\r\n"));
break;

default:
_tprintf(TEXT("SERVICE_STATE_UNKNOWN\r\n"));
}

if(!DeviceIoControl(hNTP, IOCTL_SERVICE_CONTROL, szControl, dwLen, NULL, 0, NULL, NULL))
{
dwerr = GetLastError();
_tprintf(TEXT("Error code is %d\r\n"), dwerr);
}
else
{
_tprintf(TEXT("Update success\r\n"));
}

if (!DeviceIoControl(hNTP, IOCTL_SERVICE_REFRESH, NULL, 0, NULL, 0, NULL, NULL))
{
dwerr = GetLastError();
_tprintf(TEXT("Error code is %d\r\n"), dwerr);
}
else
{
_tprintf(TEXT("Refresh success\r\n"));
}

CloseHandle(hNTP);
}
return 0;

沒有留言:

張貼留言