The*_*ang 2 c++ windows qt qt5
我试图打开注册表并修改它.这是我打开注册表的方式:
HKEY hKey;
LPCTSTR subKey = TEXT("a registry subkey to be opened");
RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS , &hKey);
Run Code Online (Sandbox Code Playgroud)
但这是一个问题,我想用a QString来实际更改子键.并把QString这样的:
QString subKeyString = QString("%1").arg(subKeyName);
LPCTSTR subKey = TEXT(subKeyString); //but it's not working here
Run Code Online (Sandbox Code Playgroud)
我想这是因为我没有改变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
Run Code Online (Sandbox Code Playgroud)
该TEXT()宏仅适用于编译时文字,而不适用于运行时数据. TCHAR而相关的API旨在帮助人们他们的代码基于ANSI-的Win9x/ME迁移到基于Unicode的WINNT 4+,通过之间的映射文字char和wchar_t,和之间的映射函数名A和W变量.但那些日子已经过去了.
在这种情况下,正确的解决方案是TCHAR完全忽略并仅关注Unicode.A QString是Unicode字符串的包装器.因此,仅使用基于Unicode的注册表API函数并假装TCHAR不存在.
在Windows上,基于Unicode的API需要UTF-16编码的wchar_t字符串.使用该QString::toStdWString()方法获取a 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);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用该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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |