2017-07-31 1 views
0

現在、REG_SZまたはREG_DWORDのいずれかの形式で書き込まれる可能性のあるレジストリ値を取得するのに、RegQueryValueEx()を使用しています。REG_DWORDまたはREG_SZのレジストリ値にRegQueryValueExを使用

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

私はREG_SZ値(例:「42314」)のデータを取得すると、私は反応してこれを取得する:

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 

は、私は後にすべてのNULLバイトを持っていませんでしたどのような方法がありますキャラクター?私はそれがそれぞれの文字のために呼び出されているRegEnumValue()のためだと思いますが、わかりません。

+0

あなたは何を求めていますか? – RbMm

+1

Unicode UTF16-LEが16bitで終わる0 –

答えて

1

問題はRegEnumValue()とは関係ありません。

アプリはUNICODEがコンパイル時に定義されているかどうかに応じて、実際にどちらかRegQueryValueExA()(ANSI)またはRegQueryValueExW()(ユニコード)にマッププリプロセッサマクロである、TCHARベースRegQueryValueEx()を呼んでいます。

RegQueryValueExW()は、文字列データを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. などWideCharToMultiByte()やequiviと同様に、Unicodeとしてそれを読んだ後、それを変換します。どちらかしな​​ければなりません貸してください。

  2. は、ドキュメントごとに、ユーザーの現在のロケールで、ANSIテキストとして文字列データを返します。これは、直接RegQueryValueExA()(またはRegGetValueA())を使用します。

    データはREG_SZREG_MULTI_SZまたはREG_EXPAND_SZタイプを持っている場合、およびこの関数のANSIバージョンが使用されます(RegQueryValueExAを明示的に呼び出すか、またはWindows.hファイルを含める前にUNICODEを定義しない)、この関数は格納された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データ(UNICODEが定義されているときにはTCHARにマップされているもの)として扱うほうがよい。

+0

素晴らしい!私は実際にそれをDWORDとして保存したかったので今すぐ私は から変換しています。 'LPDWORD value = reinterpret_cast (&byteArray);' 'DWORD output = _ttoi(value);'より効率的な方法があれば、私は知っている!私はこれらのタイプの変換にあまり慣れていません – David

+0

'REG_SZ'バッファを' LPDWORD'ポインタにキャストすることはできません(できますが、意味がありません)。 LPDWORDは '_ttoi()'を指しています。代わりにヌル終端の 'TCHAR *'ポインタが必要です。また、 'RegQueryValueEx()'は、NULL終端文字が出力バッファに存在することを保証しません。ですから、代わりに 'RegGetValue()'を使い、 'LPTSTR text = reinterpret_cast (&byteArray);を使うことができます。 DWORD値= _ttoi(テキスト); ' –

関連する問題