2011-02-10 31 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;