2010-06-20 68 views
5

我有一個關於RegOpenKeyEx,代碼問題:RegOpenKeyEx返回ERROR_SUCCESS,但它不應該(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; 
} 

保存在這樣的代碼reg.cpp,並在命令模式:

CL reg.cpp

和我REG.EXE,運行它:

d:\ tmp目錄> REG.EXE

開啓關鍵成功!

但該值尚未寫入註冊表中。

另一個奇怪的是,如果我使用visual studio創建CLI項目並將代碼粘貼到main()中,RegOpenKeyEx()將返回false。

該平臺是Windows 7,並啓用UAC。

回答

5

聽起來就像您正在進入虛擬化。如果應用程序沒有清單,當您嘗試寫入HKLM \ Software時,它實際上會寫入HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software。爲了防止這種情況,您可以運行提升的應用程序。您可能希望添加一個清單,強制它每次都運行提升。或者,停止寫信給HKLM並改用HKCU。

至於C++/CLI部分,我的猜測是你會得到一個asInvoker清單,這會抑制虛擬化並導致嘗試訪問HKLM失敗。

相關問題