我试图打开注册表并对其进行修改。这是我打开注册表的方式:

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旨在通过在charwchar_t之间映射文字以及在AW变体之间映射函数名称,来帮助人们将代码从基于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/

10-13 08:10