C++学习——获取时区列表(windows) [23.08.04]

说明:初学C++,望各位大佬批评指正,感谢万分!欢迎大家评论区留言讨论各种问题;
思路:通过访问windows的时区注册表信息获取;
关键:这三个函数的使用:RegEnumKeyEx(),RegOpenKeyEx(),RegQueryValueEx();
#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
//将wstring转换成string
std::string wstring2string(std::wstring wstr)
{
std::string result;
//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
char* buffer = new char[len + 1];
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
buffer[len] = '\0';
//删除缓冲区并返回值
result.append(buffer);
delete[] buffer;
return result;
}
int main(){
HKEY hKey;
LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"), 0, KEY_READ, &hKey);
if (result != ERROR_SUCCESS){
std::cout << "Failed to open registry key." << std::endl;
return 1;
}
TCHAR subKeyName[256];
DWORD subKeyNameSize = 256;
DWORD index = 0;
// Redirect wcout to the file stream
// Enumerate all subkeys under the Time Zones key
while (RegEnumKeyEx(hKey, index, subKeyName, &subKeyNameSize, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS){
HKEY hSubKey;
// Open the subkey for reading
result = RegOpenKeyEx(hKey, subKeyName, 0, KEY_READ, &hSubKey);
if (result == ERROR_SUCCESS){
TCHAR displayName[256];
DWORD displayNameSize = 256;
// Read the display name of the time zone
result = RegQueryValueEx(hSubKey, _T("Display"), nullptr, nullptr, reinterpret_cast<LPBYTE>(displayName), &displayNameSize);
if (result == ERROR_SUCCESS){
std::wcout << L"(" << subKeyName << L") " << displayName << std::endl;
std::wstring output = L"(" + std::wstring(subKeyName) + L") " + displayName +L"\n";
OutputDebugString(output.c_str()); // Send output to Visual Studio Output window
std::cout << wstring2string(output) << std::endl;
}
RegCloseKey(hSubKey);
}
index++;
subKeyNameSize = 256; // Reset subKeyNameSize to its original value
}
RegCloseKey(hKey);
return 0;
}
执行结果如下:
