我试图打开注册表并对其进行修改。这是我打开注册表的方式:
HKEY hKey;
LPCTSTR subKey = TEXT("a registry subkey to be opened");
RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS , &hKey);
但这是一个问题,我想使用
QString
实用地更改子项。并像这样放置QString
:QString subKeyString = QString("%1").arg(subKeyName);
LPCTSTR subKey = TEXT(subKeyString); //but it's not working here
我以为是因为我没有将
QString
更改为LPCTSTR
,所以尝试了此解决方案,但仍然想不出一种将自定义QString
放入TEXT
宏的方法。我不太确定WinApi到底是什么,我只是尝试了我可能做的事情。有办法解决这个问题吗?编辑:
这是我将
QString
转换为LPCTSTR
的方法:QString testString = "converting QString to LPCSTR";
QByteArray testStringArr = testString.toLocal8Bit();
LPCSTR lp = LPCSTR(testStringArr.constData()); //the QString is converted to LPCTSTR
//but when I put the LPCSTR to the TEXT macro, the error is still there, like the next line below will not complie
LPCSTR lp = TEXT(LPCSTR(testStringArr.constData())); //This line will not work
最佳答案
TEXT()
宏仅适用于编译时文字,不适用于运行时数据。 TCHAR
和相关的API旨在通过在char
和wchar_t
之间映射文字以及在A
和W
变体之间映射函数名称,来帮助人们将代码从基于ANSI的Win9x/ME迁移到基于Unicode的WinNT 4+。但是那些日子已经一去不复返了。
在这种情况下,正确的解决方案是完全忽略TCHAR
,而只关注Unicode。 QString
是Unicode字符串的包装器。因此,仅使用基于Unicode的Registry API函数,并假装TCHAR
不存在。
在Windows上,基于Unicode的API需要UTF-16编码的wchar_t
字符串。使用QString::toStdWString()
方法获取std::wstring
,它是wchar_t
字符串的C++包装器:
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);
关于c++ - 如何在Windows上将Qt QString转换为LPCTSTR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51027141/