2009-08-27 20 views
7

Estoy buscando una manera limpia de verificar si existe una clave de registro. Había asumido que RegOpenKey fallaría si intentaba abrir una clave que no existía, pero no es así.Comprobando si existe una clave de registro

Podría utilizar el procesamiento de cadenas para encontrar y abrir la clave principal de la que estoy buscando, y luego enumerar las subclaves de esa clave para averiguar si existe la que me interesa, pero eso se siente tanto como un cerdo de rendimiento y como una forma extraña de tener que implementar una función tan simple.

Supongo que podría usar RegQueryInfoKey para esto de alguna manera, pero MSDN no proporciona demasiados detalles sobre cómo hacerlo, en caso de que sea posible.

Actualización: Necesito la solución en win32 api, no en código administrado, .NET ni en ninguna otra biblioteca.

La documentación en MSDN parecen indicar que debe ser capaz de abrir una clave para obtener el permiso de lectura y un error si no existe, así:

lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey); 

if (lResult != ERROR_SUCCESS) 
{ 
    if (lResult == ERROR_FILE_NOT_FOUND) { 

Sin embargo, cuando llego ERROR_SUCCESS Intento esto

Actualización 2: Mi código exacto es el siguiente:

HKEY subKey = nullptr; 
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey); 
if (result != ERROR_SUCCESS) { 

... pero resultado sale como ERROR_SUCCESS, a pesar de que he puesto en una clave que no existe.

Actualización 3: Parece que ustedes tienen razón. Esto falla en un ejemplo de prueba específico (misteriosamente). Si lo intento en cualquier otra tecla, devuelve el resultado correcto. Doublechecking con el editor de registro aún no muestra la clave. No sé qué pensar de eso en absoluto.

+4

¿Cuál es la ruta a la clave que está revisando? ¿Es posible que te encuentres con uno de los caminos mágicos que se redirige (como Wow6432Node)? Recuerdo vagamente haber visto este problema antes. Creo que puedes abrir una clave inexistente. Obtendrá un error cuando intente establecer o consultar un valor en esa clave. –

+1

También podría estar en [registry VirtualStore] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx). – ghord

Respuesta

7

En primer lugar, no se preocupe por el rendimiento de este tipo de cosas. A menos que lo esté consultando a 100x por segundo, será más que suficientemente rápido. La optimización prematura le causará todo tipo de dolores de cabeza.

RegOpenKeyEx devolverá ERROR_SUCCESS si encuentra la clave. Solo revisa esta constante y estarás listo para ir.

+1

Bueno, esto no es tanto un caso de optimización prematura como de no querer agregar ese tipo de complejidad al código. – slicedlime

4

RegOpenKey devuelve un error si la clave no existe. ¿Cómo lo estás utilizando? El valor de retorno esperado es ERROR_FILE_NOT_FOUND.

Desde su código:

HKEY subKey = nullptr; 
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey); 
if (result != ERROR_SUCCESS) { 

me gustaría ver el valor de key y subPath y asegurarse de que son lo que se espera, y que la clave no existe realmente. ¿Cuál es el valor de subKey después? Obviamente, está abriendo algo: intente enumerarlo para ver cuáles son las claves y los valores que contiene.

No hay problema con RegOpenKey no devuelve un error si la clave no existe - No intentaría suponer que hay algún tipo de error de sistema operativo extraño en algo tan comúnmente utilizado como el registro.

Quizás tenga una clave de registro que no es visible para usted, el usuario que ejecuta el editor de registro, pero no su código? ¿Un problema de permisos quizás? ¿Tu código se ejecuta como un usuario elevado en Windows Vista o en el servidor 2008? ¿Intentó ejecutar el editor de registro como administrador?

+0

También puede obtener ERROR_PATH_NOT_FOUND –

0

Tenga en cuenta que junto a las funciones del Registro "central" que comienzan con "Reg" también hay funciones auxiliares que comienzan con "SHReg". Estos están diseñados para use by the Shell, es decir Explorer, pero están documentados y también se pueden usar en aplicaciones normales. Por lo general, son envolturas delgadas que facilitan algunas tareas comunes. Son parte de la "Shell LightWeight API" (shlwapi.dll)

Cuestiones relacionadas