SetSystemTime函数总是返回0

AeNet 2016-02-17 11:10:55
void ChangeSystemTime(HWND hwndEdit,ULONG ulTime)
{
FILETIME ftNew;
SYSTEMTIME stOld, stNew;
LARGE_INTEGER li;

GetLocalTime(&stOld);

stNew.wYear = 1900;
stNew.wMonth = 1;
stNew.wDay = 1;
stNew.wHour = 0;
stNew.wMinute = 0;
stNew.wSecond = 0;
stNew.wMilliseconds = 0;

SystemTimeToFileTime(&stNew,&ftNew);
li = *(LARGE_INTEGER *)&ftNew;
li.QuadPart += (LONGLONG)10000000 * ulTime;
ftNew = *(FILETIME*) &li;
FileTimeToSystemTime(&ftNew,&stNew); // 执行到这里时,stNew已经是2016年xxx正确时间了

if(SetSystemTime(&stNew)) // 然而这里返回0,系统时间也没更改
{
MessageBeep(0);
GetLocalTime(&stNew);
}
else
EditPrintf(hwndEdit,TEXT("Could NOT set new date and time."));
}

刚用GetLastError看了下是 1314, a required privilege is not held by the client 我没更改时间的特权,但是我手动右下角可以改啊,这种系统的小问题 ,哪位小哥能 给点意见
...全文
398 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
AeNet 2016-02-18
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
需要权限 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724942(v=vs.85).aspx 你看下以管理员身份运行程序是否可以
版主 这么晚了还没睡呀。
zwfgdlc 2016-02-18
  • 打赏
  • 举报
回复
程序要提权,要SE_SYSTEMTIME_NAME权限
paschen 版主 2016-02-18
  • 打赏
  • 举报
回复
需要权限 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724942(v=vs.85).aspx 你看下以管理员身份运行程序是否可以
赵4老师 2016-02-18
  • 打赏
  • 举报
回复
请牢记:这辈子永远不要手动修改服务器的系统时间!
AeNet 2016-02-18
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
需要权限 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724942(v=vs.85).aspx 你看下以管理员身份运行程序是否可以
这是我自己对话框的连接记录 Your selected IP : 129.6.15.30 WSAStartup WinSock 2.0 Socket 960 created. Connected to 129.6.15.30. Recv Failed 10038 Recv Failed 10038 Total time is -858993460 second 刚找到了 在两处Recv出错了 10038,在使用一个无效的sock。但是我创建sock时 有检查机制,没弹出Invalid_socket呀
case IDC_2:
            if (iResult = WSAStartup(MAKEWORD(2, 2), &wsaData))
            {
                EditW(hEdit, TEXT("Startup Error # %i \n"), iResult);
                //MessageBox(Dlg, TEXT("WSAStartUp Failed"), TEXT("Error"), MB_OK);
                return TRUE;
            }
            EditW(hEdit, TEXT("WSAStartup %hs \n"), wsaData.szDescription);    // %hs  是ASSCI码字符串输出
            ZeroMemory(&hint, sizeof(hint));
            hint.ai_family = AF_UNSPEC;
            hint.ai_protocol = IPPROTO_TCP;
            hint.ai_socktype = SOCK_STREAM;
            iResult = getaddrinfo(szIP, DEFAULT_PORT, &hint, &Result);  // 这里将ip 端口放入了sockaddr/sockaddr_in结构里了 ,并且将ip转成网络字节
 
            if (iResult != 0)
            {
                EditW(hEdit, TEXT("Get Address Info Failed : %s \r\n"), GetLastError());
                WSACleanup();
                return TRUE;
            }
            sock = socket(Result->ai_family, Result->ai_socktype, Result->ai_protocol);
            if (sock == INVALID_SOCKET)
            {
                EditW(hEdit, TEXT("Socket creation error #%i.\r\n"), WSAGetLastError());
                freeaddrinfo(Result);
                WSACleanup();
            }
            EditW(hEdit, TEXT("Socket %i created.\r\n"), sock);
 
            if (SOCKET_ERROR == WSAAsyncSelect(sock, Dlg, WM_SOCK_NOTIFY, FD_CONNECT | FD_READ))
            {
                EditW(hEdit, TEXT("WSAAsyncSelect error #%i. \r\n"), WSAGetLastError());
                closesocket(sock);
                WSACleanup();
                return TRUE;
            }
            size = connect(sock, Result->ai_addr, Result->ai_addrlen);    // ai_addr 是 sockaddr结构
            if (iResult == SOCKET_ERROR) {
                EditW(hEdit,TEXT("connect function failed with error: %ld\n"), WSAGetLastError());
                iResult = closesocket(sock);
                if (iResult == SOCKET_ERROR)
                    EditW(hEdit,L"closesocket function failed with error: %ld\n", WSAGetLastError());
                WSACleanup();
                return 1;
            }
            SetTimer(Dlg, 1, 1000, NULL);
            SetWindowText(hButton, TEXT("Disconect"));
            SetWindowLong(hButton, GWL_ID, IDC_CANCEL);
            return TRUE;
AeNet 2016-02-18
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
请牢记:这辈子永远不要手动修改服务器的系统时间!
Your selected IP : 129.6.15.30 WSAStartup WinSock 2.0 Socket 960 created. Connected to 129.6.15.30. Recv Failed 10038 Recv Failed 10038 Total time is -858993460 second 刚找到了 是两处Recv出错了 10038,在使用一个无效的sock。但是我创建sock时 有检查机制,没弹出Invalid_socket呀
case IDC_2:
			if (iResult = WSAStartup(MAKEWORD(2, 2), &wsaData))
			{
				EditW(hEdit, TEXT("Startup Error # %i \n"), iResult);
				//MessageBox(Dlg, TEXT("WSAStartUp Failed"), TEXT("Error"), MB_OK);
				return TRUE;
			}
			EditW(hEdit, TEXT("WSAStartup %hs \n"), wsaData.szDescription);    // %hs  是ASSCI码字符串输出
			ZeroMemory(&hint, sizeof(hint));
			hint.ai_family = AF_UNSPEC;
			hint.ai_protocol = IPPROTO_TCP;
			hint.ai_socktype = SOCK_STREAM;
			iResult = getaddrinfo(szIP, DEFAULT_PORT, &hint, &Result);  // 这里将ip 端口放入了sockaddr/sockaddr_in结构里了 ,并且将ip转成网络字节

			if (iResult != 0)
			{
				EditW(hEdit, TEXT("Get Address Info Failed : %s \r\n"), GetLastError());
				WSACleanup();
				return TRUE;
			}
			sock = socket(Result->ai_family, Result->ai_socktype, Result->ai_protocol);
			if (sock == INVALID_SOCKET)
			{
				EditW(hEdit, TEXT("Socket creation error #%i.\r\n"), WSAGetLastError());
				freeaddrinfo(Result);
				WSACleanup();
			}
			EditW(hEdit, TEXT("Socket %i created.\r\n"), sock);

			if (SOCKET_ERROR == WSAAsyncSelect(sock, Dlg, WM_SOCK_NOTIFY, FD_CONNECT | FD_READ))
			{
				EditW(hEdit, TEXT("WSAAsyncSelect error #%i. \r\n"), WSAGetLastError());
				closesocket(sock);
				WSACleanup();
				return TRUE;
			}
			size = connect(sock, Result->ai_addr, Result->ai_addrlen);    // ai_addr 是 sockaddr结构
			if (iResult == SOCKET_ERROR) {
				EditW(hEdit,TEXT("connect function failed with error: %ld\n"), WSAGetLastError());
				iResult = closesocket(sock);
				if (iResult == SOCKET_ERROR)
					EditW(hEdit,L"closesocket function failed with error: %ld\n", WSAGetLastError());
				WSACleanup();
				return 1;
			}
			SetTimer(Dlg, 1, 1000, NULL);
			SetWindowText(hButton, TEXT("Disconect"));
			SetWindowLong(hButton, GWL_ID, IDC_CANCEL);
			return TRUE;
赵4老师 别打酱油呀,千万行代码间 等你来改 上将首级啊
yhlzxq 2016-02-18
  • 打赏
  • 举报
回复
身份运行程序是否可以
paschen 版主 2016-02-18
  • 打赏
  • 举报
回复
引用 4 楼 u013315260 的回复:
[quote=引用 1 楼 paschen 的回复:] 需要权限 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724942(v=vs.85).aspx 你看下以管理员身份运行程序是否可以
但 刚刚又遇到一个 让我十分 匪夷所思的事情。
case WM_SOCK_NOTIFY:
			wEvent = WSAGETSELECTEVENT(lParam);
			wError = WSAGETSELECTERROR(lParam);
			switch (wEvent)
			{
			case FD_CONNECT:
				if (wError)
				{
					EditW(hEdit, TEXT("\nConnect error #%i. \r\n"), wError);
					SendMessage(Dlg, WM_COMMAND, IDC_CANCEL, NULL);
					return TRUE;
				}
				EditW(hEdit, TEXT("\nConnected to %hs. \r\n"), szIP);
				recv(sock, (char*)&time, 4, MSG_PEEK);  // 这里 time没变3435973836
				return TRUE;
			case FD_READ:
				KillTimer(Dlg, 1);
				if (wError)
				{
					EditW(hEdit, TEXT("\nFD_READ error #%i."), wError);
					SendMessage(Dlg, WM_COMMAND, IDC_CANCEL, 0);
					return TRUE;
				}
				recv(sock, (char*)&time, 4, 0);                      // 这里数值没变3435973836  
				time = ntohl(time);
				EditW(hEdit, TEXT("\nTotal time is %d second\n"), time);
				iResult = SetTime(time);
				if (!iResult)
				{
					EditW(hEdit, TEXT("Set System Time Failed! #%d"), iResult);
				}
				return TRUE;
以上是我的源代码,参考书上的。 然后书上的代码 第二个 不带peek的Recv函数里 改变了 time的值,从3435973836改为36....... 我真是不理解为什么,百思不得其解 。书代码变之后的 日期是对的,而我的值没变 就是19xx年了[/quote] 具体建议单步调试,然后观察分析原因
AeNet 2016-02-18
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
需要权限 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724942(v=vs.85).aspx 你看下以管理员身份运行程序是否可以
但 刚刚又遇到一个 让我十分 匪夷所思的事情。
case WM_SOCK_NOTIFY:
			wEvent = WSAGETSELECTEVENT(lParam);
			wError = WSAGETSELECTERROR(lParam);
			switch (wEvent)
			{
			case FD_CONNECT:
				if (wError)
				{
					EditW(hEdit, TEXT("\nConnect error #%i. \r\n"), wError);
					SendMessage(Dlg, WM_COMMAND, IDC_CANCEL, NULL);
					return TRUE;
				}
				EditW(hEdit, TEXT("\nConnected to %hs. \r\n"), szIP);
				recv(sock, (char*)&time, 4, MSG_PEEK);  // 这里 time没变3435973836
				return TRUE;
			case FD_READ:
				KillTimer(Dlg, 1);
				if (wError)
				{
					EditW(hEdit, TEXT("\nFD_READ error #%i."), wError);
					SendMessage(Dlg, WM_COMMAND, IDC_CANCEL, 0);
					return TRUE;
				}
				recv(sock, (char*)&time, 4, 0);                      // 这里数值没变3435973836  
				time = ntohl(time);
				EditW(hEdit, TEXT("\nTotal time is %d second\n"), time);
				iResult = SetTime(time);
				if (!iResult)
				{
					EditW(hEdit, TEXT("Set System Time Failed! #%d"), iResult);
				}
				return TRUE;
以上是我的源代码,参考书上的。 然后书上的代码 第二个 不带peek的Recv函数里 改变了 time的值,从3435973836改为36....... 我真是不理解为什么,百思不得其解 。书代码变之后的 日期是对的,而我的值没变 就是19xx年了

65,187

社区成员

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

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