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