Как сохранить настройки сервиса через InstallShield, обновить установку - PullRequest
3 голосов
/ 25 мая 2010

У меня есть проект InstallScript в IS2010. Он имеет несколько служб, которые устанавливаются. Некоторые из них являются C ++ exe и используют «InstallShield Object for NT Services». Другие приложения Java устанавливаются как службы с Java Service Wrapper через вызовы командной строки LaunchAppAndWait. Tomcat также устанавливается как сервис посредством вызова его service.bat.

Когда программа установки работает в режиме обновления, службы переустанавливаются, а настройки (автоматический или ручной запуск, перезапуск при сбое, учетная запись входа и т. Д.) Возвращаются к значениям по умолчанию.

Я хотел бы сохранить настройки службы перед передачей файлов, а затем заполнить их позже, но мне не удалось найти хороший механизм для этого. Как мне сохранить и восстановить настройки сервиса?

1 Ответ

4 голосов
/ 03 июня 2010

Я получил эту работу, прочитав служебную информацию из реестра в 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;
...