Problem z funkcja RegEnumValue()

Odpowiedz Nowy wątek
2011-07-20 12:37
0

Witam,
próbuje napisać program do listingu zmiennych w rejestrze, chce wypisać wszystkie wartości z podklucza
"DisplayName" w HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
(zrobić listę zainstalowanych programów)
Na msdn wyczytałem że musze użyć funkcji:

  • RegOpenKeyEx()
  • RegEnumValue()
  • RegCloseKey()

Oto mój kod:

#include <iostream>
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <string>
#include <windows.h>
#include <winreg.h>
 
using namespace std;
 
//========================================================
void reg_op()
{
    //==============================================================
    HKEY hKey;
 
    char val_name[255] = "DisplayName";
    //memset(&val_name,0,sizeof(val_name));
 
    DWORD val_name_size = (strlen(val_name));
 
    BYTE val_data[255];
    memset(&val_data,0,sizeof(val_data));
 
    DWORD val_data_size = 255;
    DWORD val_data_type = REG_SZ;
 
    int counter = 1;
 
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, KEY_READ, &hKey);
 
    if(GetLastError() == ERROR_SUCCESS)
    {   
        //RegQueryValueEx(hKey, TEXT("DisplayName"), 0, &val_data_type, (LPBYTE)val_data, &val_data_size);
        //===============================================
        while(RegEnumValue(hKey,counter++,val_name, &val_name_size, 0, &val_data_type, (LPBYTE)val_data, &val_data_size) != ERROR_NO_MORE_ITEMS)
        {
 
            //===============================================
            if(GetLastError() == ERROR_SUCCESS)
            {
 
                wcout << counter << "|Klucz: " << val_name << ", " << val_name_size  << "|Dane: " << (CHAR*)val_data  << ", " << val_data_size << endl;
            }
            else
            {
                cout << "Failed to read the registry.";
                break;
            }
 
        }
    }
    else
    {
        cout << "Failed to open the registry.";
    }
    RegCloseKey(hKey);
    cout << endl;
    system("pause");
}

Gdzieś wyczytałem że problem może leżeć w wielkości buffora val_data,
gdy wywale RegEnumValue() i użyję RegQueryValueEx() ale do konkretnego podklucza
np. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip
to prawidłowo wyświetla DisplayName.

Jeśli to samo zrobie z funkcją
RegEnumValue() wyświetla bezsensowne znaczki... Być może namieszałem coś w typach BYTE char itd...
moim celem jest wylistowanie wszystkich wartości DisplayName ... nie mam pomysłu jak to wykonać
może poprzez RegEnumKey() i potem RegEnumValue()...

edytowany 4x, ostatnio: Dominicuss, 2011-07-21 22:27

Pozostało 580 znaków

2011-07-22 21:02
0

Wydaje mi się, że brakuje ci wywołania funkcji RegEnumKey(Ex). Czyli w kluczu "Uninstall" najpierw odczytujesz wszystkie podklucze za pomocą RegEnumKey(Ex), a dopiero w nich odczytujesz wartość "DisplayName".

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0