3

我在IS2010的InstallScript中的项目。它有一些安装的服务。一些是C++ exes并使用“InstallShield Object for NT Services”。其他人则是通过LaunchAppAndWait命令行调用将Java Service Wrapper作为服务安装的Java应用程序。通过调用service.bat,Tomcat也作为服务安装。通过的InstallShield如何留住服务设置升级安装

当安装程序在升级模式下运行,这些服务都重新安装,并设置(自动与手动启动,重新启动的故障,登录账户上,等)将恢复为默认值。

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

回答

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; 
相关问题