2016-01-17 2 views
1

Мое приложение правильно читает и записывает в реестр. Теперь мне нужно прочитать значение реестра из:C++ - получение нулевых значений в значении, считанных из реестра

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid 

Вот мой код:

bool GetWindowsID(string &winID) 
{ 
    HKEY hKey = 0, hKeyType = HKEY_LOCAL_MACHINE; 
    bool status = false; 
    DWORD dwType = 0; 
    DWORD dwBufSize = 256; 
    char value[256] = "\0"; 
    if (RegOpenKeyEx(hKeyType, L"SOFTWARE\\Microsoft\\Cryptography", NULL, KEY_QUERY_VALUE|KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS) 
    { 
     dwType = REG_SZ; 
     if (RegQueryValueEx(hKey, L"MachineGuid", NULL, &dwType, (LPBYTE)value, &dwBufSize) == ERROR_SUCCESS) 
      status = true; 
     RegCloseKey(hKey); 
    } 
    winID.assign(value); 
    return status; 
} 

Я получаю guid но в value массива после каждого символа их является «\ 0» значение из-за к которому привязан только первый символ массива к строке. Это странно!

enter image description here

ответ

4

Вы построили таргетинг Unicode и поэтому API реестра возвращает текст UTF-16 Unicode. Вместо char используйте wchar_t и помните, что каждый элемент wchar_t имеет ширину 2 байта.

Также убедитесь, что вы учтите, что возвращаемая строка не была завершена нулем, как описано в документации. Вы должны принять во внимание значение, возвращенное в dwBufSize.

+0

Или используйте ['RegGetValue()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724868.aspx) вместо этого, который касается проблемы с нулевым терминатором для вас. –

4

Я получаю GUID, но в массиве значений после каждого символа их это значение «\ 0», благодаря которой только первый символ массива получает назначение в строку. Это странно!

Это потому, что вы вызываете версию Unicode RegQueryValueEx(), поэтому строка возвращается в Unicode (UTF-16).

Чтобы получить значение, вам придется использовать параметры широкого символа.

Изменить эту строку:

char value[256] = "\0"; 

Чтобы использовать wchar_t вместо.