2010-06-20 11 views
5

Ich habe ein Problem über RegOpenKeyEx bekam, den Code:RegOpenKeyEx Rückkehr ERROR_SUCCESS aber es sollte nicht (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; 
} 

Speichern Sie den Code in wie reg.cpp und im Befehlsmodus:

cl reg.cpp

und ich habe reg.exe, führen sie es:

D: \ tmp> reg.exe

offener Schlüsselerfolg!

Aber der Wert wurde nicht in der Registrierung geschrieben.

Eine andere seltsame Sache ist, dass, wenn ich das Visual Studio verwenden, um ein CLI-Projekt zu erstellen, und den Code in main() einfügen, wird der RegOpenKeyEx() false zurückgeben.

Die Plattform ist Windows 7, und UAC ist aktiviert.

Antwort

5

Klingt, als würden Sie in die Virtualisierung einsteigen. Wenn die App kein Manifest enthält, schreibt sie beim Schreiben in HKLM \ Software tatsächlich in HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software. Um dies zu verhindern, können Sie die App erhöht ausführen. Möglicherweise möchten Sie ein Manifest hinzufügen, das es jedes Mal erhöht ausführen muss. Alternativ können Sie aufhören, in HKLM zu schreiben und stattdessen HKCU verwenden.

Was den C++/CLI-Teil anbelangt, würde ich annehmen, dass Sie ein Manifest asInvoker erhalten, das die Virtualisierung unterdrückt und dazu führt, dass HKLM fehlschlägt.

Verwandte Themen