English 中文(简体)
RegDBKeyExists函数无法在Installshield中读取
原标题:RegDBKeyExists function fails to read in Installshield

我们在Installshiled 2008 Premier Edition中开发了MSI包,项目类型为Installscript MSI,最近我们购买了2011年,并将我们的项目升级到2011年。

在早期版本中,我们曾检查Microsoft SQL Express的注册表项,其路径为

**HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerInstance NamesSQL**

现在,一个新的要求出现了,为64位O.S.创建一个包,因为O.S.是64位的,但64位SQL Express的注册表路径是

**HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftMicrosoft SQL ServerInstance NamesSQL**

注册表函数RegDBKeyExists用于检查SQL注册表是否存在,但函数返回的负数为-2147483646,无法读取。

设置选项REGDB_OPTIONS=REGDB_OOPTIONs|REGDB_option_WOW64_64KEY将没有帮助,因为我们没有读取与64位相关的注册表配置单元。

问题回答

别那么担心Registry Reflection使这在没有额外代码的情况下做正确的事情。当一个32位应用程序访问64位计算机上的HKEY_LOCAL_MACHINESOFTWAREMicrosoft Microsoft SQL Server实例名称SQL时,它将被重定向,并参阅HKEY_LOCAL_ MACHINESTOFTWAREWow6432NodeMicrosoftMicrosoft SQL ServerInstance名称SQL(除非它通过KEY_WOW64_64KEY-等效于REGDB_OPTION_WOW64_64KEY)。

如果您将Wow6432Node键硬编码到查询中,则此场景将倾向于在一个路径下看到键,该路径包括HKLMSoftwareWow6432ModeWow6432node,但无法找到您想要查找的密钥。

作为Michael的回答和我的评论(即问题)的后续,这里有一个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;




相关问题
Post install action in installshield merge module

I am using installshield 2011. I have a merge module and I want certain exe to be executed after the merge module is installed. This exe is part of merge module files. Now when I write a custom action ...

Installshield including satellite dlls

I m having problems including satellite dll s in a installshield project. I ve tried adding a component, say "SatelliteNorwegian" for a norwegian language installation, for which I set the "Data ...

RegDBKeyExists函数无法在Installshield中读取

我们在Installshiled 2008 Premier Edition中开发了MSI包,项目类型为Installscript MSI,最近我们购买了2011年,并将我们的项目升级到2011年。

热门标签