2011-06-12 23 views
5

Quiero obtener la ruta de donde se instala una aplicación. En el registro, hay una entrada que muestra la ruta de mi aplicación, vea esta captura de pantalla: http://i56.tinypic.com/2ly1l6s.jpgleer un valor en el registro C++

Quiero leer la ruta donde se encuentra mi aplicación. En otras palabras, quiero la parte C: \ Projects \ MyApplication \ MyApplication.exe. Esto es lo que estoy tratando de hacer:

HKEY hKey; 
wchar_t mydata[2048]; 
DWORD dataLength = sizeof(mydata); 
DWORD dwType = REG_SZ; 
LPVOID messagecaliss; 
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", 0, KEY_QUERY_VALUE, &hKey); 
GetLastError(); 
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
     NULL, GetLastError(), NULL,(LPTSTR) &messagecaliss, 0, NULL); 
if (regOpenCriss == ERROR_SUCCESS) { 
RegQueryValueEx(HKEY_CURRENT_USER, "TestApplication", 0, &dwType, (BYTE*)mydata, &dataLength); 
wprintf(L"%s\n", mydata); 
system("PAUSE"); 
} 
else 
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION); 

Esto no funciona, los caracteres no deseados se imprimen. Muchas gracias.

+0

Puede ser útil especificar qué compilador/herramienta de desarrollo utiliza. – vsz

+0

Uso Visual Studio C++ 2010, windows 7 –

+0

¿Qué problema hay en la ruta desde argv []? – Andrei

Respuesta

5

está utilizando una versión que no es UNICODE o RegQueryValueEx y la está mostrando con la versión de char de ancho de printf. Utilizar cualquiera printf o cambiar a wprintf (L "% S", misdatos)

Nota: RegQueryValueEx (HKEY_CURRENT_USER, ...) debe ser RegQueryValueEx (hKey, ...)

+0

printf imprime nada en absoluto –

+0

¿existe el valor que consulta? si es así, verifique el valor de retorno de RegQueryValueEx. –

+0

Y compruebe que dwType se haya establecido en [REG_SZ] (http://msdn.microsoft.com/en-us/library/ms724884 (v = VS.85) .aspx). –

1

llegué resultados después:

  1. que rodean las cuerdas con _T()
  2. llamo RegQueryValueEx con hKey como primer parámetro

debe almacenar el resultado de RegQueryValueEx en una variable y compruébalo. Maneje el caso de falla ...

0

Un problema principal con el código que presenta es que tiene modelos de estilo C. Cada lanzamiento es un atractor de errores. Y, de hecho, algunos de tus lanzamientos son errores (ocultando que estás usando tipos de caracteres incompatibles).

Quiero leer la ruta donde se encuentra mi aplicación.

Use GetModuleFileName.

MSDN docs:
Recupera la ruta completa

Saludos & HTH,

+0

Argh, odio a los niños hormonales. ¿Por qué Dios no les dio mentes? –

+0

No soy el que menosprecia, pero creo que el OP está preguntando dónde está instalada alguna "otra" aplicación, no la que está ejecutándose actualmente. Entonces GetModuleFileName no ayudará. –

+0

@Guy: Bueno, él escribe "mi aplicación", no "otra aplicación". Pero posiblemente tengas razón de que está pensando en algo más de lo que realmente está preguntando. El código de registro apunta en esa dirección, sí, pero por otro lado, también apunta en dirección de no saber acerca de 'GetModuleFileName' ... ;-) –

1

Esto no funciona

¿Cómo sabes que sin. comprobar el valor de retorno de RegQueryValueEx?

caracteres basura se imprimen

No. No es basura. No solicitó una cadena de caracteres amplia, por lo que no puede esperar obtener una. Compile con Unicode habilitado y llame al RegQueryValueEx con L"TestApplication" o _T("TestApplication") o TEXT("TestApplication"). RegQueryValueEx es simplemente un typedef para RegQueryValueExA o RegQueryValueExW, dependiendo de si Unicode está definido durante el tiempo de compilación o no.

Muchas gracias

de qué.

+1

+1 para contrarrestar el downvoter sin sentido de drive-by. –

+0

Eres muy amable. ;) –

Cuestiones relacionadas