3

我在 IS2010 中有一个 InstallScript 项目。它有一些已安装的服务。有些是 C++ exe 并使用“InstallShield Object for NT Services”。其他是通过 LaunchAppAndWait 命令行调用使用Java Service Wrapper作为服务安装的 Java 应用程序。Tomcat 也通过调用其 service.bat 作为服务安装。

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

我想在文件传输之前保存服务设置,然后再重新填充它们,但我一直无法找到一个好的机制来做到这一点。如何保存和恢复服务设置?

4

1 回答 1

4

我通过从 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;
于 2010-06-03T13:48:23.670 回答