Prueba a poner GetLastError después del RegDeleteKeyEx. Antes de los RegClsoeKey.
Si sale un error diferente de 0, mira su significado con FormatMessage.
Si sigues sin obtener error, asegúrate que la primera clave es la correcta: antes del Delete, enumera las sub-claves para asegurarte de que existe. Si no quieres enumerar, al menos trata de abrirla.
Abre como administrador, no vaya a ser un error trivial.
Hola ivancea, gracias por la respuesta.
Se me olvidó mencionar anteriormente que no tiene privilegios la aplicación, pero es que no los debería de necesitar, para crear la clave y leerla en HKEY_CURRENT_USER no necesita privilegios, y para borrarla pues debería de ser igual (ya que también he probado a hacerlo intentandola borrar con privilegios y falla también, luego los privilegios no son el problema).
He probado como dijistes a listar el directorio (hacer un enum RegEnumKeyEx), en este caso para "HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run" y ha mostrado las claves con éxito incluida la que quiero borrar "pepito"
Luego puedo escribir en HKEY_CURRENT_USER con RegSetValueEx y leer sus variables para comprobar si existen con RegGetValue, pero el RegDeleteEx... ni con privilegios ni sin ellos es capaz de borrar en HKEY_CURRENT_USER ni en HKEY_LOCAL_MACHINE.
He probado a llamarla de 3 maneras:
RegDeleteKeyEx(hKeyOutput, keyName, options, RRF_RT_REG_SZ)
RegDeleteKeyEx(hKeyOutput, keyName, options, REG_SZ)
RegDeleteKeyEx(hKeyOutput, keyName, options, NULL)
Todas sin éxito, la clave creada es de tipo REG_SZ.
Y es que no sé, mirad esta es la funcion que ancla al registro y crea la clave que luego procedemos a borrar, funciona perfectamente:
bool AttachToRegistry(bool privileges, LPCWSTR keyName)
{
WCHAR processPath[MAX_PATH];
HKEY hKeyOutput;
HKEY hKeyInput;
DWORD options;
BOOL ret = FALSE;
hKeyInput = (privileges) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
options = (arquitecturax64()) ? KEY_ALL_ACCESS | KEY_WOW64_64KEY : KEY_ALL_ACCESS | KEY_WOW64_32KEY;
if (GetModuleFileName(NULL, processPath, MAX_PATH))
{
std::wstring p = L"\"" + std::wstring(processPath) + L"\"";
if (RegOpenKeyEx(hKeyInput, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, options, &hKeyOutput) == NO_ERROR)
{
if (RegSetValueEx(hKeyOutput, keyName, NULL, REG_SZ, (LPBYTE)p.c_str(), p.length()*2) == NO_ERROR)
{
ret = TRUE;
}
RegCloseKey(hKeyInput);
RegCloseKey(hKeyOutput);
}
}
return ret;
}
Como la de borrar es una copia de la misma, ha diferencia de que en vez de llamar a RegSetValueEx llama a RegDeleteKeyEx, probaré con RegDeleteKey y os cuento.
Saludos.
Edito: Acabo de probar con RegDeleteKey el resultado es el mismo, no funciona ni con ni sin permisos, no hay manera de borrarla, ¿algún hook?.
En el main mismo:
if (RegDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run\\pepito") == ERROR_SUCCESS)
{
cout << "Borrado";
}
cout << GetLastError();
Muestra 0, es decir no borra ni entra en el if y no detecta error.
Probaré con un tercer método que si espero que funcione, con "system", ahora os digo.
Con batch da error:, con y sin permisos:
Código:
system("REG DELETE HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\pepito");
"¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\pepito (Sí/No)? si
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados."
Me dice que no la encuentra, pero bien que aparece en regedit y al hacer el enum. :"DDD