【问题标题】:SetLocalTime gives Error 87 with Remote DebuggingSetLocalTime 通过远程调试给出错误 87
【发布时间】:2012-05-31 19:43:42
【问题描述】:

我有以下 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 中的远程调试,即使远程进程在与我的本地帐户相同的帐户下运行并且它是该系统的管理员。

【问题讨论】:

    标签: c# remote-debugging kernel32


    【解决方案1】:

    您发布的代码不包含您用来重现错误的datetime 的任何

    例如,DateTime.Year 属性的值可以介于 1 和 9999 之间(请参阅here)。另一方面,SYSTEMTIMEwYear 字段可以介于 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;
    

    【讨论】:

    • 我使用的 DateTime 是,就所有意义和目的而言,DateTime.Now,意思是 2012 年 5 月 25 日
    • @Davio:您在问题的“编辑”部分写了一些关于远程调试的内容。代码在哪个安全上下文中工作?您的“本地计算机”和远程计算机之间存在哪些差异?你确定你描述的错误来自带有DateTime.Now参数的远程计算机,或者它可能会被调用,例如未初始化的数据?
    • 我会接受的。它适用于正确的顺序和 DayOfWeek 的分配。由于 Resharper 尝试重新排序我的代码,这可能在某些时候发生了变化。
    • @Davio:我很高兴听到问题已解决。顺便说一句,我看到你几乎没有使用你的投票权。您每天有权对大约 30 个问题或答案进行投票(请参阅here)。投票是帮助搜索引擎找到有用的问题和答案的最重要方式。因此,如果您想帮助同一页面的其他访问者,您应该拥有投票权。 (这句话很常见,与我的回答无关)。 Here 你可以找到简单的规则来投票给有用的答案。
    • @Davio:还有一句话:SetLocalTimeThe documentation 说:SYSTEMTIME 结构的 wDayOfWeek 成员被忽略了。 所以DayOfWeek 的分配不是真的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2012-11-24
    • 2010-10-16
    • 2020-04-20
    • 2014-03-02
    • 2013-09-22
    相关资源
    最近更新 更多