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; 
相關問題