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.