2013-02-14 1 views
2

Dans Microsoft Visual C++, j'ai le code suivant pour accéder à un chemin dans le registre. Ensuite, j'ai lu une valeur de la clé Installed avec RegQueryValueEx. Jusqu'ici tout va bien, la valeur semble être 1, ce qui correspond à la présence de Visual C++ 2010 runtime sur mon système. (Il se trouve être un morceau de code pour détecter la présence de l'exécution C++).Pourquoi RegOpenKeyEx permet-il d'ouvrir une clé qui n'existe pas dans l'Éditeur du Registre?

Maintenant, quand je vérifie avec regedit.exe à HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0 je ne vois pas VC dans l'arbre.

Comment est-ce possible? J'ai copié/collé tous les chemins et le code dans cette question, ils doivent donc être corrects.

code en C++ application:

HKEY RegistryKey; 
DWORD ErrorCode; 
DWORD RegDwordValue = 0; 
DWORD RegDwordValueSize = sizeof(DWORD); 
if((ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE, 
       "SOFTWARE\\Microsoft\\VisualStudio\\10.0\\VC\\VCRedist\\x86", 
       0, //Reserved 
       KEY_READ, 
       &RegistryKey)) != ERROR_SUCCESS) 
{ 
    //Either the key does not exists, or registry access is denied. Anyway, detection did not succeed 
    std::cout << "Could not read registry path:\n\t" << lpcRegistryPath << "\n\tError code: " << ErrorCode; 
    return false; 
} 
if((ErrorCode = RegQueryValueEx( RegistryKey, 
            lpcValueToQuery, 
            NULL, 
            NULL, 
            (LPBYTE)&RegDwordValue, 
            &RegDwordValueSize 
            )) != ERROR_SUCCESS) 
{ 
    std::cout << "Could not read registry value, error " << ErrorCode; 
    return false; 
} 

EDIT: J'ai ajouté une exportation du Registre ci-dessous

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Debugger] 
"FEQARuntimeImplDll"="C:\\Program Files\\Microsoft Visual Studio 10.0\\Common7\\Packages\\Debugger\\X64\\Microsoft.VisualStudio.Debugger.Runtime.Impl.dll" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Packages] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Packages\{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Packages\{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}\Settings] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Packages\{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}\Settings\Tools] 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Packages\{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}\Settings\Tools\SSISScript] 
"ScriptLanguage"="CSharp" 
+1

Voir le lien dans cette vieille réponse de [la mienne] (http://stackoverflow.com/questions/14585286/c-regcreatekeyex-success-but-without-result/14585359#14585359) – hmjd

Répondre

5

Ce que vous décrivez se passe si vous êtes sur un système 64 bits en cours d'exécution d'un 32 application -bit qui est affectée par Registry Redirection ou Registry Virtualization. Si votre application VC++ est en 32 bits et que vous exécutez la version 64 bits de regedit, ou si votre application est en 64 bits et que vous exécutez la version 32 bits de regedit, alors ils vont effectivement afficher/manipuler différentes zones de le registre. Cela expliquerait pourquoi ils ne voient pas les données de l'autre.

+0

Oui c'est ça! http://support.microsoft.com/kb/305097 me montre que les clés de registre 32 bits sont situés dans HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node Maintenant, le chemin d'accès complet est HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 10.0 \ VC Merci pour le rapide Aidez-moi!! –

Questions connexes