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()...