2011-02-10 34 views
0
We have developed MSI package in Installshiled 2008 Premier Edition and project type is Installscript MSI, recently we bought 2011 and upgrdaded our project to 2011. 

閱讀在早期版本中,我們用來檢查微軟的SQL Express的註冊表項和它的路徑是RegDBKeyExists函數失敗InstallShield中

**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL** 

現在新的要求來到了64位創建一個包OS,因爲操作系統是64位,但在64位的SQL Express中的註冊表路徑是

**HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL** 

註冊表函數RegDBKeyExists是檢查SQL註冊表的存在,但函數返回一個負數作爲-2147483646,未能讀。

設置選項REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY不會幫助,因爲我們沒有讀取與64位相關的註冊表配置單元。

請幫忙。

謝謝

回答

1

不用擔心這麼多; Registry Reflection使這做沒有額外的代碼正確的事情。當32位應用在64位機器上訪問HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL時,它將被重定向並參見HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL(除非它通過KEY_WOW64_64KEY-相當於REGDB_OPTION_WOW64_64KEY)。

如果您將Wow6432Node密鑰硬編碼到您的查詢中,該場景將傾向於看到包含HKLM\Software\Wow6432Node\Wow6432Node\...的路徑下的密鑰,並且無法找到您想要查找的密鑰。

+0

如何避免註冊表反射?這阻止了我讀取我需要的數據。 – BuvinJ 2015-04-22 20:49:05

0

作爲後續行動,以邁克爾的回答和我的評論(即問題),這裏是一個安裝InstallScript功能切換註冊表反射:

prototype void EnableRegistryReflection(BOOL); 
/////////////////////////////////////////////////////////////////////////////// 
//                   
// Function: EnableRegistryReflection 
//                   
// Purpose: Toogle the automatic conversion of registry keys from 64 to 32 bit equalivents. 
//   This is enabled by default. 
//                   
/////////////////////////////////////////////////////////////////////////////// 
function void EnableRegistryReflection(bEnable) 
begin 
    if(bEnable) then 
     REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY; 
    else 
     REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;  
    endif; 
end;