2009-02-03 24 views
12

Estoy tratando de crear una nueva clave de registro en el registro de Windows usando C++. Aquí está el código que tengo hasta ahora:Crear una nueva clave de registro de Windows usando C++

HKEY hKey; 
    LPCTSTR sk = TEXT("SOFTWARE\\OtherTestSoftware"); 

    LONG openRes = RegCreateKeyEx(
      HKEY_LOCAL_MACHINE, 
      sk, 
      0, 
      NULL, 
      REG_OPTION_BACKUP_RESTORE, 
      KEY_ALL_ACCESS, 
      NULL, 
      &hKey, 
      NULL); 

    if (openRes==ERROR_SUCCESS) { 
     printf("Success creating key."); 
    } else { 
     printf("Error creating key."); 
    } 

    LPCTSTR value = TEXT("OtherTestSoftwareKey"); 
    LPCTSTR data = "OtherTestData\0"; 

    LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1); 

    if (setRes == ERROR_SUCCESS) { 
     printf("Success writing to Registry."); 
    } else { 
     printf("Error writing to Registry."); 
    } 

    //RegDeleteKey(hKey, sk); 

    LONG closeOut = RegCloseKey(hKey); 

    if (closeOut == ERROR_SUCCESS) { 
     printf("Success closing key."); 
    } else { 
     printf("Error closing key."); 
    } 

soy capaz de abrir correctamente una clave existente utilizando un fragmento de código muy similar (básicamente reemplazar RegCreateKeyEx con RegOpenKeyEx). Me imagino que uno o más de los argumentos que estoy pasando a RegCreateKeyEx está causando el problema. Honestamente, no estoy seguro de dónde se van a ensuciar las cosas, ya que todos los códigos de error que he atrapado muestran el éxito. Como referencia, aquí está la firma de función para RegCreateKeyEx:

/* 
* LONG WINAPI RegCreateKeyEx(
     __in  HKEY hKey, 
     __in  LPCTSTR lpSubKey, 
     __reserved DWORD Reserved, 
     __in_opt LPTSTR lpClass, 
     __in  DWORD dwOptions, 
     __in  REGSAM samDesired, 
     __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
     __out  PHKEY phkResult, 
     __out_opt LPDWORD lpdwDisposition 
    ); 
*/ 

¡Cualquier idea sería genial!

gracias, Brian

+0

Dónde exactamente está ocurriendo su error (supongo que en la llamada RegCreateKeyEx(), pero no deberíamos tener que adivinar), y ¿qué devuelve GetLastError()? –

+0

¿Tiene la intención de intentar eliminar la clave que acaba de crear? –

+1

En lugar de REG_OPTION_BACKUP_RESTORE, debe pasar REG_OPTION_NON_VOLATILE (= 0). Puede consultar el comportamiento de tales opciones desde MSDN http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx – Ismael

Respuesta

1

La primera pista es el uso de REG_OPTION_BACKUP_RESTORE. Probablemente no desee utilizar ese indicador, ya que creo que requiere un privilegio especial de "copia de seguridad" que debe habilitar de antemano. Las aplicaciones normales no querrán hacer eso.

+0

Sí; no solo necesita el privilegio, sino que debe habilitarlo explícitamente a través de una llamada API de seguridad; a menos que ya lo sepas, probablemente no quieras usarlo. :) – Nick

+0

Cambiado a REG_OPTION_NON_VOLATILE, no parece haberlo solucionado. –

2

Como ya mencionamos, ha especificado la opción REG_OPTION_BACKUP_RESTORE en la llamada al RegCreateKeyEx, lo que significa que está abriendo la clave para realizar una copia de seguridad o restauración. Normalmente, usaría REG_OPTION_NON_VOLATILE en su lugar.

¿Qué sistema operativo está ejecutando? En Windows 2000/XP, la sección de registro HKEY_LOCAL_MACHINE no es escribible por usuarios que no son administradores, por lo que RegCreateKeyEx fallará con un error de acceso denegado (error 5). Esto también se aplica a Vista, si su aplicación tiene una entrada requestedExecutionLevel en su manifiesto. Si está ejecutando Vista, y su aplicación no especifica un requestedExecutionLevel (o si no tiene ningún manifiesto), el acceso al HKEY_LOCAL_MACHINE se virtualizará, por lo que RegCreateKeyEx debería tener éxito. Vea Registry Virtualization in Windows Vista en MSDN para más detalles.

Hay más problemas con el código que ha publicado, que solo se pondrán de manifiesto si compila su proyecto con UNICODE definido. Esta línea:

LPCTSTR data = "OtherTestData\0"; 

debería ser

LPCTSTR data = TEXT("OtherTestData\0"); 

y esta línea:

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, 
    (LPBYTE)data, _tcslen(data)+1); 

debería ser:

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, 
    (LPBYTE)data, (_tcslen(data)+1) * sizeof(TCHAR)); 

porque el parámetro cbData en RegSetValueEx es la leng th de los datos en bytes, no caracteres.

Espero que esto ayude!

+0

Hice sus cambios con una excepción: (_tcslen (datos) +1) * sizeof (TCHAR) cambió a (strlen (datos) +1) * sizeof (TCHAR) ya que no compilaría de la primera manera. De nuevo, no se devolvieron códigos de error, simplemente no hace lo que esperaba. Gracias por los consejos, parece que me estoy acercando. –

+0

Agregue #include para usar _tcslen(). – ChrisN

+0

Si se habilitó Unicode, no creo que 'LPCTSTR data =" "' compile. –

13

He estado compilando mi Biblioteca de funciones personal durante años. Una parte de esto trata completamente con el acceso de registro, vea la función CreateRegistryKey el archivo Registry.Cpp.

Si está interesado, puede tomar el entire library here.

+1

De hecho, voy a dar una puñalada con esto: ¡se ve muy amigable gracias! –

+1

Enlace Registry.cpp roto, intente en su lugar: http://svn.networkdls.com/svn/OpenSource/@Libraries/NSWFL/NSWFL_Registry.Cpp –

+0

No definí IsWinNT –

Cuestiones relacionadas