kil*_*ick 7 c++ windows registry registrykey
系统:Windows 7 32位
语言:C++
我试图访问寄存器HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0,密钥Driver(类型REG_SZ) - 没问题.
例如,对于读取来说HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM,所有键(类型REG_SZ)都有斜线\Device\Serial0.
在读取这些键时,它总是返回2(没有这样的文件),并带有以下示例代码:
HKEY hKey = 0;
DWORD dwType = REG_SZ;
char buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS )
{
auto ret = RegQueryValueEx( hKey, TEXT("\Device\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize );
// ret always == 2 for key with slashes
--- CUT ---
Run Code Online (Sandbox Code Playgroud)
使用名称中的斜杠读取键值的正确方法是什么?
我在使用变量而不是文本字符串时遇到了同样的问题.
我认为这两种方法都有单斜杠和双斜杠:
HKEY hKey = 0;
DWORD keyType = REG_SZ;
TCHAR buf[255] = {0};
DWORD bufSize = sizeof(buf);
QSettings winReg("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat);
auto comsKey = winReg.allKeys();
FOREACH( auto com, comsKey )
{
// FOREACH - boost macro
// comsKey = QList<QString> (list of key names) [from Qt framework]
// com = QString (single key name) [from Qt framework]
if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS )
{
wchar_t* keyw = new wchar_t();
//com.replace("/", "\\\\"); <- checked both variants commented and not commented; com == /Device/Serial0 so im converting to \\Device\\Serial0
int size = com.size();
mbstowcs( keyw, com.toStdString().data(), size );
//auto ret = RegQueryValueEx( hKey, TEXT("\\Device\\Serial0"), 0, &keyType, (LPBYTE)buf, &bufSize ); // <- this works!
auto ret = RegQueryValueExW( hKey, (LPCWSTR)&keyw, 0, &keyType, (LPBYTE)buf, &bufSize ); // <- this one not works!
Run Code Online (Sandbox Code Playgroud)
我已尝试使用"\ Device ..","/ Device","\ Device"等所有变体.
你必须逃避斜线,就像你在第一行中所做的那样......
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS )
{
auto ret = RegQueryValueEx( hKey, TEXT("\\Device\\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize );
// ret always == 2 for key with slashes
Run Code Online (Sandbox Code Playgroud)
如果不这样做,则该RegQueryValueEx函数找不到指定的键,并返回ERROR_FILE_NOT_FOUND(== 2).
但还有另一个问题.您应该将缓冲区数组声明为类型wchar_t(或TCHAR),而不是char:
TCHAR buf[255] = {0};
Run Code Online (Sandbox Code Playgroud)
否则,该RegQueryValueEx函数将尝试使用从指定的注册表项读取的Unicode字符串填充数组,并且您将获得一些不可读的内容.
| 归档时间: |
|
| 查看次数: |
33367 次 |
| 最近记录: |