C++ 在windows xp上更改时区

C++ 在windows xp上更改时区,c++,windows,visual-studio,windows-xp,C++,Windows,Visual Studio,Windows Xp,您好,我正在尝试更改windows xp上的时区,我正在遵循此操作。我使用C++,似乎没有设置适当的特权标志。 代码如下: TIME_ZONE_INFORMATION tzInfo, tzInfoNew, tzInfoTest; DWORD dwRet; HANDLE hToken; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hTo

您好,我正在尝试更改windows xp上的时区,我正在遵循此操作。我使用C++,似乎没有设置适当的特权标志。 代码如下:

TIME_ZONE_INFORMATION tzInfo, tzInfoNew, tzInfoTest;
DWORD dwRet;

HANDLE hToken;
TOKEN_PRIVILEGES tkp;

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME , &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

dwRet = GetTimeZoneInformation(&tzInfo);
std::wcout << "STANDARD NAME: " << tzInfo.StandardName << std::endl;

tzInfoNew.Bias = tzInfo.Bias + 60;
StringCchCopy(tzInfoNew.StandardName, 32, L"Nikola Time Zone");
tzInfoNew.StandardDate.wMonth = 10;
tzInfoNew.StandardDate.wDayOfWeek = 0;
tzInfoNew.StandardDate.wDay = 5;
tzInfoNew.StandardDate.wHour = 2;

StringCchCopy(tzInfoNew.DaylightName, 32, L"Nikola Daylight Zone");
tzInfoNew.DaylightDate.wMonth = 4;
tzInfoNew.DaylightDate.wDayOfWeek = 0;
tzInfoNew.DaylightDate.wDay = 1;
tzInfoNew.DaylightDate.wHour = 2;
tzInfoNew.DaylightBias = -60;


if( !SetTimeZoneInformation(&tzInfoNew ) ) 
{
    printf("STZI failed (%d)\n", GetLastError());
}
dwRet = GetTimeZoneInformation(&tzInfoTest);
std::wcout << "STANDARD NEW NAME: " << tzInfoTest.StandardName << std::endl;
std::wcout << "STANDARD NEW DAYLIGHT NAME: " << tzInfoTest.DaylightName << std::endl;

tkp.Privileges[0].Attributes = 0; 
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
以下是整个方法:

bool::setTimeZone(short int timeZone, short int dstOffset, dstDate& sDate, dstTime& sTime, dstDate& eDate, dstTime& eTime){
  bool res = true;

  TIME_ZONE_INFORMATION tzInfoNew;

  HANDLE hToken;
  TOKEN_PRIVILEGES tkp;

  // Get the necessary priviledge to perform time zone setting operation
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
  LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME , &tkp.Privileges[0].Luid);
  tkp.PrivilegeCount = 1;
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

  // Fill the TIME_ZONE_INFORMATION structure
  ZeroMemory(&tzInfoNew, sizeof(tzInfoNew));
  tzInfoNew.Bias = (LONG) -timeZone;

  // Start of DST
  // If the following six lines are executed, then setting the time zone fails
  // i.e. it goes with result status 0, but the time zone is not changed
  tzInfoNew.DaylightDate.wMonth = sDate.month;
  tzInfoNew.DaylightDate.wDayOfWeek = sDate.week;
  tzInfoNew.DaylightDate.wDay = sDate.day;
  tzInfoNew.DaylightDate.wHour = sTime.hour;
  tzInfoNew.DaylightDate.wMinute = sTime.minute;
  tzInfoNew.DaylightBias = dstOffset;

  // End of DST
  tzInfoNew.StandardDate.wMonth = eDate.month;
  tzInfoNew.StandardDate.wDayOfWeek = eDate.week;
  tzInfoNew.StandardDate.wDay = eDate.day;
  tzInfoNew.StandardDate.wHour = eTime.hour;
  tzInfoNew.StandardDate.wMinute = eTime.minute;

  if(!SetTimeZoneInformation(&tzInfoNew)) {
    printf("STZI failed (%d)\n", GetLastError());
    res = false; 
  }

  tkp.Privileges[0].Attributes = 0; 
  AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);

  return (res);
}

因此,SetTimeZoneInformation返回状态OK,但未设置时区。只有在设置DaylightDate信息时才会出现问题,否则就可以了。

我发现了问题,在设置任何数据之前,我没有对时区信息结构使用ZeroMemory宏

ZeroMemory(&tzInfoNew, sizeof(tzInfoNew));
tzInfoNew.Bias = 0;
StringCchCopy(tzInfoNew.StandardName, 32, L"Test Time Zone");
.....

我认为使用它是无关紧要的。但它成功了,我不太清楚为什么,因为我已经设置了所有必要的信息,并且在设置时区时结构已满。

错误值是多少?状态
应用程序必须具有SE\u时区\u名称权限,此功能才能成功。
还有示例代码。SE\u时区\u名称是从Windows Vista开始实现的,因此您不能在XP中使用它。文档说明,对于XP SE_SYSTEMTIME_,需要使用名称。没有错误,因为函数返回0。但是当我稍后检索时区信息时,它告诉我时区没有被更改。你是对的,我错过了XP提示,很抱歉。很高兴你找到了它。它看起来像
StandardBias
,如果没有它,
SYSTEMTIME
结构中的一些变量将无法初始化,并且基于填写它的复杂规则,几乎可以保证会发生奇怪的冲突。是的,你是对的,但这让我困惑,没有任何错误代码现在有一个新问题,请参见问题中的编辑部分。
ZeroMemory(&tzInfoNew, sizeof(tzInfoNew));
tzInfoNew.Bias = 0;
StringCchCopy(tzInfoNew.StandardName, 32, L"Test Time Zone");
.....