2010-05-04 11 views
1

J'ai une application développée avec .Net Compact frame work 3.5, j'ai besoin de synchroniser la date et l'heure du périphérique avec le serveur central lors de chaque appel de service Web.Définition de la date et de l'heure système à partir de l'application

Merci.

+2

duplication possible de http://stackoverflow.com/questions/738615/set-device-time-on-net-cf –

+2

@Sundar: tant de questions sans une seule réponse acceptée. Commencer à marquer les réponses ou ne soyez pas surpris que les gens ne vous répondent pas. – Shaihi

Répondre

2

Si vous avez le client NTP sur votre appareil, vous pouvez l'utiliser. Le serveur (s) sont configurés en une valeur de registre multichaîne à:

[HKLM\Services\TIMESVC] 
server 

Voici comment le code pour forcer le client à synchroniser. Sinon, il y a une valeur de Registre pour la fréquence à laquelle les synchronisations de client (DWORD pour ms):

[HKLM\Services\TIMESVC] 
Refresh 

synchronisation Force:

internal static class NativeMethods 
{ 
    internal const int INVALID_HANDLE_VALUE = -1; 
    internal const int IOCTL_SERVICE_CONTROL = (0x104 << 16) | (7 << 2); 
    internal const uint GENERIC_READ = 0x80000000; 
    internal const uint GENERIC_WRITE = 0x40000000; 
    internal const int OPEN_EXISTING = 3; 

    [DllImport("coredll.dll", SetLastError = true)] 
    internal static extern IntPtr CreateFile(
     string lpFileName, 
     uint dwDesiredAccess, 
     uint dwShareMode, 
     IntPtr lpSecurityAttributes, 
     uint dwCreationDisposition, 
     uint dwFlagsAndAttributes, 
     IntPtr hTemplateFile); 

    [DllImport("coredll.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool DeviceIoControl(
     IntPtr hDevice, 
     int dwIoControlCode, 
     byte[] lpInBuffer, 
     int nInBufferSize, 
     byte[] lpOutBuffer, 
     int nOutBufferSize, 
     ref int lpBytesReturned, 
     IntPtr lpOverlapped); 

    [DllImport("coredll.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool CloseHandle(IntPtr hObject); 
} 

internal static class TimeServer 
{ 
    public static bool SyncTime() 
    { 
     byte[] input = System.Text.Encoding.Unicode.GetBytes("Sync\0"); 
     return TimeServer.DeviceIOCTL("NTP0:", NativeMethods.IOCTL_SERVICE_CONTROL, input); 
    } 

    private static bool DeviceIOCTL(string deviceName, int ioctl, byte[] input) 
    { 
     int size = 0; 
     return TimeServer.DeviceIOCTL(deviceName, ioctl, input, null, ref size); 
    } 

    public static bool DeviceIOCTL(string deviceName, int ioctl, byte[] input, byte[] output, ref int bytesReceived) 
    { 
     bool result = false; 

     IntPtr deviceHandle = NativeMethods.CreateFile(
      deviceName, 
      NativeMethods.GENERIC_READ | NativeMethods.GENERIC_WRITE, 
      0, 
      IntPtr.Zero, 
      (uint)NativeMethods.OPEN_EXISTING, 
      0, 
      IntPtr.Zero); 

     if (deviceHandle.ToInt32() != NativeMethods.INVALID_HANDLE_VALUE) 
     { 
      try 
      { 
       result = NativeMethods.DeviceIoControl(
        deviceHandle, 
        ioctl, 
        input, 
        (input == null) ? 0 : input.Length, 
        output, 
        (output == null) ? 0 : output.Length, 
        ref bytesReceived, 
        IntPtr.Zero); 
      } 
      finally 
      { 
       NativeMethods.CloseHandle(deviceHandle); 
      } 
     } 

     return result; 
    } 
} 
1

j'ai pu synchroniser le temps en utilisant la SNTP Client Project from the Codeproject

Cependant, a dû changer la déclaration Pinvoke à utiliser [DllImport("coredll.dll")] au lieu de [DllImport("kernal32.dll")]

J'ai fait ce vent de course ows mobile 6.1, compacte framework 3.5

+0

Version plus récente ici: http://bocan.ro/Media/Default/Downloads/InternetTime.zip – franDayz