9

系统:Windows 7 32bit
语言:C++

我试图访问 register HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0, key Driver(type 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 ---

读取名称中带有斜杠的键值的正确方法是什么?


以上已由 Cody Gray 正确回答。
下面是另一个问题。


当我使用变量而不是文本字符串时,我遇到了同样的问题。
Iv 考虑了使用单斜杠和双斜杠的两种方法:

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!

我已经尝试了所有带有“\Device..”、“/Device”、“\Device”等的变体。

4

1 回答 1

8

你必须避开斜线,就像你在第一行中所做的那样......

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

如果不这样做,该RegQueryValueEx函数将找不到指定的键,并返回ERROR_FILE_NOT_FOUND(== 2)。


但还有另一个问题。您应该将缓冲区数组声明为类型wchar_t(或TCHAR),而不是char

TCHAR buf[255] = {0};

否则,该RegQueryValueEx函数将尝试使用从指定注册表项读取的 Unicode 字符串填充数组,并且您将得到一些不可读的内容。

于 2011-12-21T11:21:04.187 回答