none
Получение данных из реестра RRS feed

  • Вопрос

  • Вот кусок кода для проверки:


    HKEY fKey;
    DWORD pcbData = 255;
    char* pvData = new char[pcbData];


    if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ".xml", 0, KEY_QUERY_VALUE, &fKey) == ERROR_SUCCESS)                  //Открываем ключ HKEY_CLASSES_ROOT/.xml
    {
    if (RegQueryValueEx(fKey, "", NULL, NULL, (LPBYTE)pvData, &pcbData) == ERROR_SUCCESS)                //Читаем его значение (по умолчанию) - "xmlfile"
    {
    RegCloseKey(fKey);                 //Закрываем ключ
    if(RegOpenKeyEx(HKEY_CLASSES_ROOT, pvData, 0, KEY_QUERY_VALUE, &fKey) == ERROR_SUCCESS)          //Открываем ключ HKEY_CLASSES_ROOT/xmlfile
    {
    if (RegQueryValueEx(fKey, "", NULL, NULL, (LPBYTE)pvData, &pcbData) == ERROR_SUCCESS) //Читаем его значение (по умолчанию) - "XML Document"
    AfxMessageBox(pvData);
    else
    AfxMessageBox("Не могу прочитать HKEY_CLASSES_ROOT\\xmlfile.@");                  //В итоге получаем сообщение об ошибке 
    }
    else
    AfxMessageBox("Не могу открыть HKEY_CLASSES_ROOT\\xmlfile");
    }
    else
    AfxMessageBox("Не могу прочитать HKEY_CLASSES_ROOT\\.xml.@");
    }
    else
    AfxMessageBox("Не могу открыть HKEY_CLASSES_ROOT\\.xml");
    delete[] pvData;


    Не хочет читать данные. То что они есть в реестре сомнений нет. Единственное что мне не понятно, так это то, что ошибка возникает в том случае, если у ключа кроме значение по умолчанию есть еще и другие значения. 
    • Изменено crymchanin 14 марта 2012 г. 11:16
    14 марта 2012 г. 11:15

Ответы

  • Здравствуйте.

    Проверяйте возвращаемые значения функции RegQueryValueEx, чтобы более детально уточнить ошибку. В данном случае у меня ваш код возвращает ошибку  ERROR_MORE_DATA, что значит - the lpData buffer is too small to receive the data.

    Попробуйте применить последновательное увеличение буфера до того момента, пока ошибка не пропадет, как это показано в примере к данной функции:

    #include <windows.h>
    #include <malloc.h>
    #include <stdio.h>
    
    #define TOTALBYTES    8192
    #define BYTEINCREMENT 4096
    
    void main()
    {
        DWORD BufferSize = TOTALBYTES;
        DWORD cbData;
        DWORD dwRet;
    
        PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
        cbData = BufferSize;
    
        printf("\nRetrieving the data...");
    
        dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                                 TEXT("Global"),
                                 NULL,
                                 NULL,
                                 (LPBYTE) PerfData,
                                 &cbData );
        while( dwRet == ERROR_MORE_DATA )
        {
            // Get a buffer that is big enough.
    
            BufferSize += BYTEINCREMENT;
            PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
            cbData = BufferSize;
    
            printf(".");
            dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("Global"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
        }
        if( dwRet == ERROR_SUCCESS )
            printf("\n\nFinal buffer size is %d\n", BufferSize);
        else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
    }


    Для связи [mail]

    • Помечено в качестве ответа crymchanin 14 марта 2012 г. 13:27
    14 марта 2012 г. 12:37

Все ответы

  • Здравствуйте.

    Проверяйте возвращаемые значения функции RegQueryValueEx, чтобы более детально уточнить ошибку. В данном случае у меня ваш код возвращает ошибку  ERROR_MORE_DATA, что значит - the lpData buffer is too small to receive the data.

    Попробуйте применить последновательное увеличение буфера до того момента, пока ошибка не пропадет, как это показано в примере к данной функции:

    #include <windows.h>
    #include <malloc.h>
    #include <stdio.h>
    
    #define TOTALBYTES    8192
    #define BYTEINCREMENT 4096
    
    void main()
    {
        DWORD BufferSize = TOTALBYTES;
        DWORD cbData;
        DWORD dwRet;
    
        PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
        cbData = BufferSize;
    
        printf("\nRetrieving the data...");
    
        dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                                 TEXT("Global"),
                                 NULL,
                                 NULL,
                                 (LPBYTE) PerfData,
                                 &cbData );
        while( dwRet == ERROR_MORE_DATA )
        {
            // Get a buffer that is big enough.
    
            BufferSize += BYTEINCREMENT;
            PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
            cbData = BufferSize;
    
            printf(".");
            dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("Global"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
        }
        if( dwRet == ERROR_SUCCESS )
            printf("\n\nFinal buffer size is %d\n", BufferSize);
        else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
    }


    Для связи [mail]

    • Помечено в качестве ответа crymchanin 14 марта 2012 г. 13:27
    14 марта 2012 г. 12:37
  • Спасибо! Странно конечно, что не хватает памяти. Как я думал размера буфера - 255 будет достаточно для строки которая содержит в себе описание типа файла.

    Проблема решена. Было мало не динамически выделенной памяти, а просто после нескольких вызовов функции RegQueryValueEx, менялось значение lpcbData (теперь понятно почему берется адрес переменной, а не ее значение).

    • Изменено crymchanin 14 марта 2012 г. 14:15
    14 марта 2012 г. 13:27