Problem z funkcja RegEnumValue()

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

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".

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