![](/img/trans.png)
[英]How to Read the Credentials cache from the Windows registry from c++
[英]Read Timezoneinfo from windows registry (C++)
我正在尝试使用以下代码从 windows 注册表中读取 TIME_ZONE_INFORMATION 结构:
void GetTimeZoneInfo(){
TIME_ZONE_INFORMATION tz = {0};
TIME_ZONE_INFORMATION tz_data={0};
char *keyname="TZI";
DWORD size = sizeof(tz_data);
HKEY hk = NULL;
char *zone_key = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\Central Standard Time";
if ((RegOpenKeyExA(HKEY_LOCAL_MACHINE, zone_key, 0, KEY_READ, &hk) == ERROR_SUCCESS))
{
if(RegQueryValueExA(hk, keyname, NULL, NULL, (LPBYTE) &tz_data, &size) == ERROR_SUCCESS)
{ /*Control enters here*/
/*Read the data*/
cout<<"Successful in retrieving the value"<<endl;
tz.Bias = tz_data.Bias;
tz.DaylightBias = tz_data.DaylightBias;
tz.DaylightDate = tz_data.DaylightDate;
tz.StandardBias = tz_data.StandardBias;
tz.StandardDate = tz_data.StandardDate;
}
else{ cout<<"Failure in retrieving the value"<<endl;}
}
else { cout<<"RegOpenKey Failure!"<<endl;}
}
它将所有值设置为零,但在运行 RegOpenKeyExA 和 RegQueryValueExA 时看不到任何错误。 TIME_ZONE_INFORMATION 作为类型存储在注册表中:REG_BINARY
这是从注册表读取的正确方法吗?
根据MS docs TZI 密钥包含以下时区信息:
typedef struct _REG_TZI_FORMAT
{
LONG Bias;
LONG StandardBias;
LONG DaylightBias;
SYSTEMTIME StandardDate;
SYSTEMTIME DaylightDate;
} REG_TZI_FORMAT;
您正在阅读错误的结构 - TIME_ZONE_INFORMATION。
有几件事:
在大多数情况下,您应该使用DYNAMIC_TIME_ZONE_INFORMATION
结构,因为它支持注册表中的全部数据。 大多数 Win32 时区函数都有可用于动态结构的替代版本。
您不需要自己从注册表中加载信息。 相反,请使用EnumDynamicTimeZoneInformation
。 枚举它们,直到TimeZoneKeyName
与您要查找的匹配。
正如nevilad 指出的那样,注册表数据中的TZI
条目与_REG_TZI_FORMAT
对齐,这与TIME_ZONE_INFORMATION
结构略有不同。 (但同样,您不需要自己从注册表中读取。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.