2010-06-20 5 views
5

J'ai un problème à propos RegOpenKeyEx, le code:RegOpenKeyEx retour ERROR_SUCCESS mais il ne doit pas (Windows 7)

#include <tchar.h> 
#include <stdio.h> 
#include <windows.h> 

#pragma comment (lib, "Advapi32.lib") 


int main() { 
    TCHAR *keyName = _T("SOFTWARE\\foobar2000\\capabilities"); 
    HKEY key = NULL; 
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) { 
     printf("open key failed!\n"); 
     return -1; 
    } else { 
      printf("open key success!\n"); 
    } 

    TCHAR *value = _T("123"); 
    if (RegSetValueEx(key, _T("xxx"), 0, REG_SZ, 
      (const BYTE *)value, sizeof(TCHAR) * (_tcslen(value) + 1)) != ERROR_SUCCESS) { 
     printf("set value failed!\n"); 
    } 
    RegCloseKey(key); 
    return 0; 
} 

Enregistrer le code tels que reg.cpp, et en mode de commande:

cl reg.cpp

et je suis reg.exe, exécutez:

D: \ tmp> reg.exe

succès clé ouverte!

Mais la valeur n'a pas été écrite dans le registre.

Une autre chose étrange est que si j'utilise le studio visuel pour créer un projet CLI, et collez le code dans main(), le RegOpenKeyEx() retournera false.

La plate-forme est Windows 7 et l'UAC est activé.

Répondre

5

On dirait que vous utilisez la virtualisation. SI l'application n'a pas de manifeste, lorsque vous essayez d'écrire dans HKLM \ Software, elle écrit en réalité HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software. Pour éviter cela, vous pouvez exécuter l'application élevée. Vous pouvez ajouter un manifeste le forçant à s'exécuter à chaque fois. Vous pouvez également arrêter d'écrire sur HKLM et utiliser HKCU à la place. En ce qui concerne la partie C++/CLI, je suppose que vous recevrez un manifeste asInvoker pour celui-ci, qui supprime la virtualisation et entraîne la tentative d'échec de HKLM.

Questions connexes