0

次の C# コードがあります。

 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);
}

ただし、これにより、メソッドを呼び出すたびにエラーコード 87 が表示されます。何かアイデアはありますか?

編集:ローカルマシンで確認したところ、正常に動作しました。 リモート プロセスがローカル アカウントと同じアカウントで実行され、そのシステムの管理者であっても、Visual Studio からのリモート デバッグでは機能しません。

4

1 に答える 1

2

投稿したコードには、エラーを再現するために使用したが含まれていません。datetime

たとえば、DateTime.Yearプロパティは 1 ~ 9999 の値を持つことができます (こちらを参照)。反対側のwYearフィールドはSYSTEMTIME1601 から 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;
于 2012-05-25T08:26:19.910 に答える