2012-05-25 3 views
0

У меня есть следующий код C#:SetLocalTime дает ошибку 87 с удаленной отладкой

public static void SetDateTime(System.DateTime datetime) 
    { 
     var systemNew = new SystemTime 
      { 
       wDay = (ushort)datetime.Day, 
       wMonth = (ushort)datetime.Month, 
       wYear = (ushort)datetime.Year, 
       wHour = (ushort)datetime.Hour, 
       wMinute = (ushort)datetime.Minute, 
       wSecond = (ushort)datetime.Second, 
       wMilliseconds = (ushort)datetime.Millisecond 
      }; 

     // update system clock 
     NativeMethods.SetLocalTime(ref systemNew); 
     int errorCode = Marshal.GetLastWin32Error(); 
     if (errorCode != 0) 
     { 
      Debug.WriteLine("SetDateTime error: {0}", errorCode); 
     } 
    } 

internal struct SystemTime 
{ 
    internal ushort wDay; 
    internal ushort wDayOfWeek; 
    internal ushort wHour; 
    internal ushort wMilliseconds; 
    internal ushort wMinute; 
    internal ushort wMonth; 
    internal ushort wSecond; 
    internal ushort wYear; 
} 

internal static class NativeMethods 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    internal static extern int SetLocalTime(ref SystemTime lpSystemTime); 
} 

Однако, это дает мне ERRORCODE 87 каждый раз я вызываю метод, любые идеи?

Редактировать: Я проверил его на своей локальной машине, и он отлично работает. Он не работает с удаленной отладкой из Visual Studio, хотя удаленный процесс работает под той же учетной записью, что и моя локальная учетная запись, и является администратором этой системы.

ответ

2

код, который вы вывесили не содержат какое-либо значения из datetime, который вы использовали для воспроизведения ошибки.

Например, DateTime.Year свойство может иметь значение от 1 до 9999 (см. here). С другой стороны wYear поле SYSTEMTIME может быть между 1601 и 30827.

Так что я рекомендую вам в первую очередь проверить старые значения входных структур, которые вы используете в качестве вклада в SetLocalTime.

ОБНОВЛЕНО: Мне кажется, что я знаю происхождение проблемы сейчас. Вы определили SystemTime с неправильным порядком полей как:

internal struct SystemTime 
{ 
    internal ushort wDay; 
    internal ushort wDayOfWeek; 
    internal ushort wHour; 
    internal ushort wMilliseconds; 
    internal ushort wMinute; 
    internal ushort wMonth; 
    internal ushort wSecond; 
    internal ushort wYear; 
} 

SYSTEMTIME но определяется как

typedef struct _SYSTEMTIME { 
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
} SYSTEMTIME, *PSYSTEMTIME; 
+0

DateTime я использовал, для всякого смысла и целей, DateTime.Now, то есть 25-ого Май 2012 г. – Davio

+0

@Davio: Вы пишете что-то о дистанционной отладке в части «Изменить» вашего вопроса. В каком контексте безопасности работает код? Какие различия существуют между вашей «локальной машиной» и удаленным компьютером? Вы уверены, что описанная вами ошибка появляется на удаленном компьютере с параметром DateTime.Now или, вероятно, будет вызвана, например, с неинициализированными данными? – Oleg

+0

@ Давио: Я обновил свой ответ. – Oleg

Смежные вопросы