代码之家  ›  专栏  ›  技术社区  ›  David

对注册表值使用RegQueryValueEx,该注册表值可以是REG\U DWORD或REG\U SZ

  •  0
  • David  · 技术社区  · 9 年前

    RegQueryValueEx() 检索可能写入 REG_SZ REG_DWORD

    BYTE byteArray[MAX];
    DWORD dataSize = sizeof(byteArray);
    DWORD type = 0;
    RegQueryValueEx(
            hKey,
            subKey,
            nullptr,
            &type,
            reinterpret_cast<BYTE*>(&byteArray),
            &dataSize));
    

    当我得到一个 REG_SZ公司

    byteArray   0x004fe6a8 "4"  unsigned char[100]
        [0] 52 '4'  unsigned char
        [1] 0 '\0'  unsigned char
        [2] 50 '2'  unsigned char
        [3] 0 '\0'  unsigned char
        [4] 51 '3'  unsigned char
        [5] 0 '\0'  unsigned char
        [6] 49 '1'  unsigned char
        [7] 0 '\0'  unsigned char
        [8] 52 '4'  unsigned char
        [9] 0 '\0'  unsigned char
        [10]0 '\0'  unsigned char
    

    有没有办法在每个字符后都不能有空字节?我想是因为 RegEnumValue() 每个角色都被调用,但我不确定。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Remy Lebeau    9 年前

    你的问题与 RegEnumValue() .

    你的应用正在调用 TCHAR -基于 RegQueryValueEx() ,它实际上是一个预处理器宏,映射到 RegQueryValueExA() (ANSI)或 RegQueryValueExW() (Unicode),取决于 UNICODE

    RegQueryValueXw() 以UTF-16LE格式的Unicode文本形式返回字符串数据,这正是您在缓冲区中看到的,因此很明显,您的应用程序是为Unicode编译的。你看到的是完全正常的行为。

    BYTE byteArray[MAX];
    DWORD dataSize = sizeof(byteArray);
    DWORD type = 0;
    if (RegQueryValueEx( // <-- calling the TCHAR version!
        hKey,
        subKey,
        nullptr,
        &type,
        reinterpret_cast<BYTE*>(&byteArray),
        &dataSize) == 0)
    {
        switch (type)
        {
            case REG_DWORD:
            {
                LPDWORD value = reinterpret_cast<LPDWORD>(&byteArray);
                // use *value as needed ...
                break;
            }
    
            case REG_SZ:
            case REG_MULTI_SZ:
            case REG_EXPAND_SZ:
            {
                // note the T in LPTSTR!  That means 'TCHAR' is used...
                LPTSTR text = reinterpret_cast<LPTSTR>(&byteArray);
                // use text as needed, up to (dataSize/sizeof(TCHAR)) number
                // of TCHARs. This is because RegQueryValueEx() does not
                // guarantee the output data has a null terminator.  If you
                // want that, use RegGetValue() instead...
                break;
            }
        }
    }
    

    或:

    BYTE byteArray[MAX];
    DWORD dataSize = sizeof(byteArray);
    DWORD type = 0;
    if (RegQueryValueExW( // <-- calling the UNICODE version!
        hKey,
        subKey,
        nullptr,
        &type,
        reinterpret_cast<BYTE*>(&byteArray),
        &dataSize) == 0)
    {
        switch (type)
        {
            case REG_DWORD:
            {
                LPDWORD value = reinterpret_cast<LPDWORD>(&byteArray);
                // use *value as needed ...
                break;
            }
    
            case REG_SZ:
            case REG_MULTI_SZ:
            case REG_EXPAND_SZ:
            {
                // note the W in LPWSTR!  That means 'WCHAR' is used...
                LPWSTR text = reinterpret_cast<LPWSTR>(&byteArray);
                // use text as needed, up to (dataSize/sizeof(WCHAR)) number
                // of WCHARs. This is because RegQueryValueExW() does not
                // guarantee the output data has a null terminator.  If you
                // want that, use RegGetValueW() instead...
                break;
            }
        }
    }
    

    1. 将其读取为Unicode后进行转换,例如使用 WideCharToMultiByte() 或等效。

    2. 使用 RegQueryValueExA() (或 RegGetValueA()

      REG_SZ REG_MULTI_SZ REG_EXPAND_SZ RegQueryValueExA 或者不定义 UNICODE 在包括 Windows.h 该函数将存储的Unicode字符串转换为ANSI字符串,然后将其复制到 lpData .

      BYTE byteArray[MAX];
      DWORD dataSize = sizeof(byteArray);
      DWORD type = 0;
      if (RegQueryValueExA( // <-- calling the ANSI version
          hKey,
          subKey,
          nullptr,
          &type,
          reinterpret_cast<BYTE*>(&byteArray),
          &dataSize) == 0)
      {
          switch (type)
          {
              case REG_DWORD:
              {
                  LPDWORD value = reinterpret_cast<LPDWORD>(&byteArray);
                  // use *value as needed ...
                  break;
              }
      
              case REG_SZ:
              case REG_MULTI_SZ:
              case REG_EXPAND_SZ:
              {
                  // note the lack of T in LPSTR! That means 'char' is used...
                  LPSTR text = reinterpret_cast<LPSTR>(&byteArray);
                  // use text as needed, up to dataSize number of chars. This
                  // is because RegQueryValueExA() does not guarantee the
                  // output data has a null terminator.  If you want that,
                  // use RegGetValueA() instead...
                  break;
              }
          }
      }
      

    无论是哪种方式,只要注意,您都有可能丢失您决定转换为的目标字符集中不存在的任何非ASCII字符。因此,最好坚持使用Unicode,并按如下方式处理缓冲区数据 WCHAR 数据(什么 TCHAR公司 映射到何时