首页 > 解决方案 > 从 Windows 注册表中读取 Timezoneinfo (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

这是从注册表读取的正确方法吗?

标签: c++windowstimezoneregistry

解决方案


根据MS docs TZI 密钥包含以下时区信息:

typedef struct _REG_TZI_FORMAT
{
    LONG Bias;
    LONG StandardBias;
    LONG DaylightBias;
    SYSTEMTIME StandardDate;
    SYSTEMTIME DaylightDate;
} REG_TZI_FORMAT;

您正在阅读错误的结构 - TIME_ZONE_INFORMATION。


推荐阅读