代码之家  ›  专栏  ›  技术社区  ›  sjohnston

如何通过InstallShield升级安装保留服务设置

  •  3
  • sjohnston  · 技术社区  · 16 年前

    我在IS2010中有一个InstallScript项目。它有一些服务可以安装。有些是C++ exes,使用“NestServices的安装掩护对象”。其他是安装为服务的Java应用程序。 Java Service Wrapper 通过launchappandwait命令行调用。Tomcat也通过调用service.bat作为服务进行安装。

    当安装程序以升级模式运行时,将重新安装服务,并将设置(自动与手动启动、失败时重新启动、登录帐户等)还原为默认设置。

    我想在文件传输之前保存服务设置,然后在传输之后重新填充它们,但是我还没有找到一个好的机制来完成这项工作。如何保存和恢复服务设置?

    1 回复  |  直到 16 年前
        1
  •  4
  •   sjohnston    16 年前

    我通过读取OnUpdateUIBefore中的注册表中的服务信息,将其存储在全局变量中,然后将信息写回OnUpdateUIAfter中的注册表来完成这项工作。

    代码:

    export prototype void LoadServiceSettings();
    function void LoadServiceSettings()
    number i, nResult;
    string sServiceNameArray(11), sRegKey, sTemp;
    BOOL bEntryFound;
    begin
    PopulateServiceNameList(sServiceNameArray);
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
    //write service start values to the registry
    for i = 0 to 10
        if (ServiceExistsService(sServiceNameArray(i))) then
            sRegKey = "SYSTEM\\CurrentControlSet\\Services\\" + sServiceNameArray(i);
            nResult = RegDBSetKeyValueEx(sRegKey, "Start", REGDB_NUMBER, sServiceSettings(i), -1);
            if(nResult < 0) then
                MessageBox ("Unable to save service settings: " + sServiceNameArray(i) + ".", SEVERE);
            endif;
        endif;
    endfor;
    RegDBSetDefaultRoot(HKEY_CLASSES_ROOT); //set back to default
    end;
    
    export prototype void SaveServiceSettings();
    function void SaveServiceSettings()
    number i, nType, nSize, nResult;
    string sServiceNameArray(11), sRegKey, sKeyValue;
    begin
    PopulateServiceNameList(sServiceNameArray);
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
    for i = 0 to 10
        if (ServiceExistsService(sServiceNameArray(i))) then
            //get service start values from registry
            sRegKey = "SYSTEM\\CurrentControlSet\\Services\\" + sServiceNameArray(i);
            nResult = RegDBGetKeyValueEx(sRegKey, "Start", nType, sKeyValue, nSize);
            if(nResult < 0) then
                MessageBox ("Unable to save service settings: " + sServiceNameArray(i) + ".", SEVERE);
            endif;
            sServiceSettings(i) = sKeyValue;
        endif;
    endfor;
    RegDBSetDefaultRoot(HKEY_CLASSES_ROOT); //set back to default
    end;