在InstallShield 2012中确定Excel位数

时间:2013-05-10 18:40:06

标签: excel installation 64-bit installshield

我正在使用InstallShield 2012为Excel加载项构建安装包。由于MS Excel具有32位版本和64位版本,因此我需要单独构建安装包。理想情况下,在将文件复制到目标计算机之前,设置文件应该能够在安装的前几个步骤中检测Excel位数(而不是Windows位数)。然而,经过一些在线的广泛研究,我还没有找到一种可靠的方法来确定Excel的位数。任何有想法的人,请随时提供帮助。感谢

3 个答案:

答案 0 :(得分:1)

以下是我使用的(LUA - Setup Factory)代码:即使未安装Outlook,它也能正常工作。

-- check if 64 bit office installed

s64_14 = Registry.GetValue(3, "Software\\Wow6432Node\\Microsoft\\Office\\14.0\\Outlook","Bitness",true);
s64_15 = Registry.GetValue(3, "Software\\Wow6432Node\\Microsoft\\Office\\15.0\\Outlook","Bitness",true);
s64_16 = Registry.GetValue(3, "Software\\Wow6432Node\\Microsoft\\Office\\16.0\\Outlook","Bitness",true);

bl64Bit = false;

if (s64_14=="x64" or s64_15=="x64" or s64_16=="x64") then
    bl64Bit = true
end

-- check for 64-bit OS
bl64BitOS=false;
if SessionVar.Expand("%ProgramFilesFolder%") ~= SessionVar.Expand("%ProgramFilesFolder64%") then
    bl64BitOS=true
end

答案 1 :(得分:0)

我与Advanced Installer用户进行过类似的讨论,您可以在our forums上查看,用户想要检测Office的位数。

答案 2 :(得分:0)

您应创建2个属性以跟踪安装的Excel版本,然后将这些属性用作功能条件“EXCEL32_EXISTS = 0”。这是我用来完成此操作的代码,最初EXCEL32_EXISTS和EXCEL64_EXISTS都设置为0.

Excel_Installed=FALSE;
szKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\excel.exe";

if (RegDBKeyExist(szKey)=1) then
        Excel_Installed=TRUE;
        RegDBGetKeyValueEx ( szKey, "Path", nvType, ExcelPath, nvSize );
        SprintfMsiLog( "Found Excel @ %s", ExcelPath );

        if ( StringContains(ExcelPath, "Office11")=TRUE ) then
            Excel_Installed=FALSE;
        elseif ( SYSINFO.bIsWow64=FALSE ) then
            MsiSetProperty(hMSI, "EXCEL32_EXISTS", "1");
        elseif ( (StringContains(ExcelPath, "(x86)")=TRUE) || (StringContains(ExcelPath, "Office12")=TRUE) ) then
            MsiSetProperty(hMSI, "EXCEL32_EXISTS", "1");
        else
            MsiSetProperty(hMSI, "EXCEL64_EXISTS", "1");
        endif;
endif;


export prototype BOOL StringContains(STRING,STRING);
function BOOL StringContains(szSource, szArgs)
    BOOL bContains;
begin

    if(szSource % szArgs) then
        bContains = TRUE;
    else
        bContains = FALSE;
    endif;

    return bContains;
end;