2012-08-28 154 views
0

你好我正在嘗試使用32位和64位編譯代碼讀寫註冊表值。每個編譯應該讀/寫相同的位置。 我曾嘗試使用KEY_WOW64_32KEY無濟於事。KEY_WOW64_32KEY在32位和64位編譯之間給出不同的結果

當我用32位目標編譯下面的代碼時,它會寫入並讀取值。 當我用64位目標進行編譯時,它無法找到或寫入密鑰。

編輯:以下代碼可以在Windows XP 64位上使用32位和64位版本正常工作。 Windows 7 64位出現問題。

任何幫助表示讚賞, Rob。

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

#define ISVALIDHANDLE(x) (x != NULL && x != INVALID_HANDLE_VALUE) 
#define KEY_ACCESS_DEF  (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY) 
#define KEYPATH "SOFTWARE\\X\\Y" 
#define KEYNAME "Z" 

static bool 
doInstallKey(HKEY key, const char *keypath, const char *keyname, const char *keyvalue) 
{ 
    HKEY     rootKey, myKey; 
    bool     r = false; 

    RegOpenKeyEx(key, NULL, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &rootKey); 

    if(ISVALIDHANDLE(rootKey)) 
    { 
     HRESULT    res; 
     unsigned long  createType; 

     res = RegCreateKeyEx(rootKey, keypath, 0, NULL, 
        REG_OPTION_NON_VOLATILE, 
        KEY_ACCESS_DEF, NULL, &myKey, &createType); 

     if(ISVALIDHANDLE(myKey)) 
     { 
      RegSetValueEx(myKey, keyname, 0, 
       REG_SZ, (unsigned char *)keyvalue, strlen(keyvalue)+1); 


      RegCloseKey(myKey); 

      r = true; 
     } 
     else 
     { 
      // If we cant create it, maybe it already exits, 
      // just change the value. 

      res = RegOpenKeyEx(rootKey, keypath, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &myKey); 

      if(ISVALIDHANDLE(myKey)) 
      { 
       RegSetValueEx(myKey, keyname, 0, 
        REG_SZ, (unsigned char *)keyvalue, strlen(keyvalue)+1); 

       RegCloseKey(myKey); 

       r = true; 
      } 
      else 
      { 
       // error 
      } 
     } 

     RegCloseKey(rootKey); 
    } 

    return r; 
} 

static int 
doGetInstallKey(HKEY key, const char *keypath, const char *keyname, 
      char *keyvalue, unsigned long keylen) 
{ 
    HKEY  rootKey, myKey; 
    int   valid = 0; 

    keyvalue[0] = 0; 

    RegOpenKeyEx(key, NULL, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &rootKey); 

    if(ISVALIDHANDLE(rootKey)) 
    { 
     RegOpenKeyEx(key, keypath, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &myKey); 

     if(ISVALIDHANDLE(myKey)) 
     { 
      unsigned long  type = 0; 
      HRESULT    res; 

      res = RegQueryValueEx(myKey, keyname, NULL, 
         &type, (unsigned char *)keyvalue, &keylen); 

      if (res == ERROR_SUCCESS) 
       valid = keylen; 

      RegCloseKey(myKey); 
     } 

     RegCloseKey(rootKey); 
    } 

    return valid; 
} 


int 
main(int argc, char *argv[]) 
{ 
    char buf[1024]; 
    int  len = 1023; 

    // read key 
    doGetInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, buf, len); 
    fprintf(stdout, "BEFORE: %s\n", buf); 

    // write key 
    doInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, "def64"); 

    // read key 
    doGetInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, buf, len); 
    fprintf(stdout, "AFTER: %s\n", buf); 

    return 0; 
} 
+0

你忘了使用RegCreateKeyEx –

+0

選項 'KEY_ACCESS_DEF' 保存選項。 (我知道這個名字有點誤導)。 然而,即使沒有創建它,閱讀仍然無法找到什麼32位應用程序以前寫。 – rbairos

回答

1

您是否在Windows 7上測試時以管理員身份運行?你可能會運行到Registry Virtualization

+0

謝謝,就是這樣!太糟糕了,我不能在64位編程關閉它,但我找到了解決方法。謝謝 – rbairos

0

嘗試更換

#define KEY_ACCESS_DEF  (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY) 

#define KEY_ACCESS_DEF  (KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)