求助:SetLocalTime 为什么不能设置系统时间啊?谢谢2!

MJXQJ888 2008-11-27 04:53:39
请教:
我用 GetLocalTime() 可以得到系统
我想用 SetLocalTime 来设置系统时间,可是不能设置

void GameSet::ParameterSetLocalTime( )
{
int i;
SYSTEMTIME systime;
systime.wYear = 2008 ;
systime.wMonth = 12;
systime.wDay = 1 ;
systime.wHour = 0;
systime.wMinute = 0;
systime.wSecond = 0;
i = SetLocalTime(&systime);
}


我是错在哪里啊?
除了 SetLocalTime
还可以用别的来设置系统时间吗?

谢谢!
...全文
1174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwillbeback008 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hai040 的回复:]
getlasterror是参数不正确
加上
memset(&systime, 0, sizeof(systime));
就行了
[/Quote]

是阿,我的之前做的好好的,后来就死活不行,说参数错误,

在重新赋值给SYSTEMTIME 变量systime前,先执行
memset(&systime, 0, sizeof(systime));

然后赋值在执行SetLocalTime(&systime);
才能成功设置时间
toadzw 2008-11-27
  • 打赏
  • 举报
回复
你应该重新看一下这个函数的定义
就呆在云上 2008-11-27
  • 打赏
  • 举报
回复
转贴:具体那位大侠忘了,是当日着急粘过来的,在此表示感谢


一日,编程急需XP下调整系统时间的代码。最初想上网找吧,省事点,不料诺大一个internet,找个现成的代码居然如此困难(按理说应该有,不过我确实没找到)。只好自己写了,而且在这里贴出来,以便节省大家的时间。

正文:
在Win2000中,调整系统时间很eazy,只要运用如下代码即可。
SYSTEMTIME st;
GetSystemTime(&st); // gets current time
st.wHour = hour; // adjusts hours
st.wMinute = minutes; // and minutes

if (!SetSystemTime(&st)) // sets system time
{
..
}



可是在XP下,直接这样使用的话,你会发现这样做没效果。因为进程缺少相应的权限。这在MSDN中说的很清楚:

SetLocalTime
....
Remarks
The SetLocalTime function enables the SE_SYSTEMTIME_NAME privilege before changing the local time. This privilege is disabled by default.


怎么办呢?其实很简单,XP下关机的代码你有没有?有,那只要把其中修改进程权限的地方稍加改动,把SE_SHUTDOWN_NAME改为SE_SYSTEMTIME_NAME 即可。(没有?看下面的代码,还不快记在小本本上 ^_^)


//XP下调整系统时间的演示
BOOL CSyncTimeDlg::SetSysTime()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );

// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, //注意,改的就是它
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
return FALSE;

//取得必要权限后,设置系统时间
SYSTEMTIME systm;
::GetLocalTime(&systm); //得到当前的本地时间
systm.wMonth += 1; //作为演示,我们让月份和小时数加1
systm.wHour += 1;

if(0 != ::SetLocalTime(&systm))
{
return TRUE;
}
else
{
return FALSE;
}
hai040 2008-11-27
  • 打赏
  • 举报
回复
getlasterror是参数不正确
加上
memset(&systime, 0, sizeof(systime));
就行了
hai040 2008-11-27
  • 打赏
  • 举报
回复
setsystemtime

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧