欢迎光临散文网 会员登陆 & 注册

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

2023-08-04 23:20 作者:凛丶飒  | 我要投稿

说明:初学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;

}

执行结果如下:

windows时区列表



C++学习——获取时区列表(windows) [23.08.04]的评论 (共 条)

分享到微博请遵守国家法律