【问题标题】:how set the windows clock using c++如何使用 C++ 设置 Windows 时钟
【发布时间】:2011-10-29 07:04:43
【问题描述】:

我正在尝试使用 C++ 设置 Windows 系统时钟。 我正在尝试使用以下代码(不工作):

#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {

    SYSTEMTIME st;
    st.wDay = 1;
    st.wMonth = 5;
    st.wYear = 2011;
    st.wHour = 12;
    st.wMinute = 15;
    bool result = SetLocalTime(&st);
    cout << result;
    return 0;
}

有人能指出我的错误吗?提前致谢。

【问题讨论】:

  • 根据the documentationSetLocalTime 返回BOOL 而不是bool
  • @WTP 很好,它返回BOOL,并标记为WINAPI (__stdcall)。它不返回WINAPI :) 另外,Mask,您需要说明如何您的代码不起作用,而不仅仅是它不起作用。
  • @Seth Carnegie 我从未使用过 Windows API。我只是阅读了文档。无论如何,谢谢你的信息。

标签: c++ winapi time


【解决方案1】:

哪个 Windows 版本?在 Vista+ 上,您需要管理员权限才能设置时间。以管理员身份运行您的程序,它应该可以工作。

好吧,正如亚当在下面写的那样,管理员权限不是严格要求的,但让我们开始让它以简单的方式工作;-)

另外,我会 ZeroMemory(&st, sizeof(st)) 以确保诸如秒之类的额外成员不包含不可接受的值。更好的是,只需初始化结构的所有成员。

【讨论】:

  • 从技术上讲,您需要SE_SYSTEMTIME_NAME 权限,您可以通过成为管理员获得该权限,但这不是唯一的方法。
  • 同意。当你写你的评论时,我正在查找所需的 priv ;-)
  • 查看我关于 st 初始化的编辑。 GetLastError() 说什么?
  • @Serge: GetLastError() // 这里说的是 87
【解决方案2】:

st 未完全初始化并包含无效值。完全初始化它,代码就可以工作了。如果您调用了 GetLastError(),它会立即提示您,因为它返回 87,即 ERROR_INVALID_PARAMETER。星期几、秒和毫秒字段无疑包含无效值。

【讨论】:

  • 谢谢!和其他注意事项:值的类型是 WORD 而不是 int 我已经设置
【解决方案3】:

来自 SetLocalTime() 文档:

调用进程必须具有 SE_SYSTEMTIME_NAME 权限。默认情况下禁用此权限。 SetLocalTime 函数在更改本地时间之前启用 SE_SYSTEMTIME_NAME 权限,并在返回之前禁用该权限。有关详细信息,请参阅以特殊权限运行。

一个可能的解决方案是在链接器选项中打开 UAC:

打开项目属性对话框,进入 Linker->Manifest 并将 UAC 设置为“requireAdministrator”。

缺点是您必须以管理员身份运行 Visual Studio 才能调试您的程序。

【讨论】:

  • 感谢您的回复。我做到了,但仍然无法正常工作,并且 SetLocalTime 为我返回 0。
【解决方案4】:

你需要初始化你不需要的参数为0。

替换:

SYSTEMTIME st;

与:

SYSTEMTIME st;
ZeroMemory(&st, sizeof(st));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多