Макрос TEXT()
работает только с литералами времени компиляции, а не с данными времени выполнения.TCHAR
и связанные API-интерфейсы были разработаны, чтобы помочь людям перенести свой код из Win9x / ME на основе ANSI в WinNT 4+ на основе Unicode, сопоставляя литералы между char
и wchar_t
и сопоставляя имена функций между A
иW
варианты.Но эти дни давно прошли.
правильное решение в этой ситуации - полностью игнорировать TCHAR
и сосредоточиться только на Unicode.QString
- это оболочка для строки Unicode.Поэтому используйте только функции API реестра на основе Unicode и притворяйтесь, что TCHAR
не существует.
В Windows API на основе Unicode ожидают строки wchar_t
в кодировке UTF-16.Используйте метод QString::toStdWString()
, чтобы получить std::wstring
, который является оболочкой C ++ для строки wchar_t
:
QString subKeyString = QString("%1").arg(subKeyName);
std::wstring subKey = subKeyString.toStdWString();
HKEY hKey;
RegOpenKeyExW(HKEY_LOCAL_MACHINE, subKey.c_str(), 0, KEY_ALL_ACCESS, &hKey);
В качестве альтернативы, вы можете использовать метод QString::utf16()
.Однако он возвращает указатель const ushort*
, поэтому вам придется привести его к типу const wchar_t*
:
QString subKeyString = QString("%1").arg(subKeyName);
LPCWSTR subKey = reinterpret_cast<LPCWSTR>(subKeyString.utf16());
HKEY hKey;
RegOpenKeyExW(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &hKey);