9

システム: Windows 7 32bit
言語: C++

HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0register 、 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 に答える