RegQueryInfoKey -> Retorna un numero erroneo?

Iniciado por someRandomCode, 27 Octubre 2014, 14:52 PM

0 Miembros y 1 Visitante están viendo este tema.

someRandomCode

Hola, muchachos, estoy medio atorado con un pedazo de programa que estoy escribiendo..
La idea es listar los programas instalados QUE FIGURAN en "Agregar o Quitar programas"..
Pero, el problema viene que RegQueryInfoKey me retorna un valor que nada que ver en cuanto a la cantidad de subclases que una clase tiene en el registro..
A continuacion el codigo:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define MAXIMO_NOMBRE_LLAVE 16384 // 16383 + '\0'
#define MAXIMO_VALOR_LLAVE 256 // 255 + '\0'
void listar_software_instalado()
{
HKEY llave;
TCHAR buffer[512] = "";
DWORD largo_buffer;// = MAX_PATH;

DWORD retcode = RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",&llave);
if (retcode != ERROR_SUCCESS) {
printf("Error al abrir la llave\n");
return;
}
DWORD cantidad_de_subclases = 0;
retcode = RegQueryInfoKey(
llave,
buffer,
&largo_buffer,
NULL,
&cantidad_de_subclases,
//NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
);
if (retcode != ERROR_SUCCESS) {
printf("RegQueryInfoKey -> error: %d\n",retcode);
return;
}
DWORD indice = 0;
printf("Cantidad de subclases encontradas: %d\n",cantidad_de_subclases);
/*for (indice = 0 ; indice < cantidad_de_subclases ; indice++) {
printf("Software instalado encontrado (%d)\n",indice);
}*/
RegCloseKey(llave);
}


En mi caso retorna 446 (?) cuando (contados a mano en esa clase) hay 113..
Pero no entiendo donde le estoy pifiando..
PD: puede haber typos en el codigo porque lo estaba copiando de un papel y ando medio distraido

eferion

Código (cpp) [Seleccionar]

TCHAR buffer[512] = "";
DWORD largo_buffer;// = MAX_PATH;


largo_buffer debería contener el tamaño máximo del buffer... y sin embargo la variable está sin inicializar, eso puede provocar que se pise memoria al leer datos del registro. Por cierto, "largo_buffer=MAX_PATH" seguirá estando mal, ya que el tamaño que estás asignando al buffer es 512.

Además, creo recordar que estas funciones trabajan con wchar_t, no con char... sería conveniente poner el prefijo "L" al string de la ruta: L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

Por lo demás no he visto nada raro.

Un saludo.





Eternal Idol

¿Es tu programa de 32 bits y tu S.O. de 64 bits? Si es asi en realidad tu programa esta abriendo HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

Registry Keys Affected by WOW64

Y no cambies las cadenas, esta trabajando en ANSI, sino no compilaria:
Unicode and ANSI names
RegQueryInfoKeyW (Unicode) and RegQueryInfoKeyA (ANSI)

RegQueryInfoKey function
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

someRandomCode

Definitivamente, esta abriendo Wow6432Node..
El tema de asignarle a largo_buffer el valor MAX_PATH es porque en http://msdn.microsoft.com/en-us/library/windows/desktop/ms724256(v=vs.85).aspx estan haciendo eso, pero de cualquier manera entiendo lo que decis, por eso esta comentado de cualquir manera, mala eleccion de nombres.. :P

Gracias muchachos, cualquier cosa molesto de nuevo

Eternal Idol

Entonces retorna el valor correcto  ::) Ahi en la MSDN explica como saltar la redireccion si queres.

De nadas.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

someRandomCode

Cita de: Eternal Idol en 28 Octubre 2014, 00:15 AM
Entonces retorna el valor correcto  ::) Ahi en la MSDN explica como saltar la redireccion si queres.

De nadas.


Vos sabes que lo estuve mirando, pero en fin de cuentas, es mejor mirar en Wow6432Node como me redirige porque ahi si me figuran todos(incluidas las tontecas de Steam)

Me parece que me voy a poner a hacerle una limpieza a esta maquina porque ya hace cada pavada.. Ademas el hecho de que haya estado 8 meses encendida no ayuda :/
Menos cuando vivis probando boludeces jeje..

Aparte de eso estuve mirando en stackoverflow que otros lugares tendria que mirar para rescatar la lista de software+actualizaciones instaladas, todo porque estoy intentando hacer una limpieza profunda del sistema de archivos y del registro a mano (bueno quien dice a mano dice programaticamente no? :P) pero me da que va a terminar siendo mejor idea cargar de nuevo.. Total al SSD le sobran ciclos todavia y el resto esta en una de las particiones de los HDD..