Вопрос Установка и запуск службы

Хамик

Старожил
Как создать процедуру с собственной функцией запуска? Нужно воссоздать вот такое:
Код:
AfterInstall: "DoServiceInstall('{app}\DfSdkS.exe', 'DfSdkS', 'Defragmentation-Service', 'Defrag Service - powered by mst software')";
Как воссоздать процедуру DoServiceInstall? В данном примере идет установка службы дефрагментации, где, по моему мнению:
{app}\DfSdkS.exe - программа
DfSdkS - ключ установки сервиса
Defragmentation-Service - имя
Defrag Service - powered by mst software - описание

Помогите, пожалуйста. У кого какие идеи будут? У меня вот такое в голову пришло
Код:
procedure DoServiceInstall;
var
FileName, Params, SERVICE_DISPLAYNAME, SERVICE_DESCIPTION: string;
ResultCode: Integer;
begin
  Exec(ExpandConstant('FileName'), 'Params', 'SERVICE_DISPLAYNAME', 'SERVICE_DESCIPTION', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
Знаю что бред, потому что в программировании не знаюсь и поэтому прошу помощи.
 

Shegorat

Lord of Madness
Администратор
Хамик
Думаю как-то так. Не проверял.
Код:
function DoServiceInstall(Path, ServiceName, ServiceDisplayName, ServiceDescription: String): Boolean;
var
  res1, res2: Longint;
begin
  Exec(ExpandConstant('{sys}\sc.exe'), 'create '+ServiceName+' binPath= "'+ExpandConstant(Path)+'" DisplayName= "'+ServiceDisplayName+'"', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res1);
  Exec(ExpandConstant('{sys}\sc.exe'), 'description '+ServiceName+' "'+ServiceDescription+'"', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res2);
  Result:= (res1 >= 0) and (res2 >= 0);
end;

function DoServiceUninstall(ServiceName: String): Boolean;
var
  res: Longint;
begin
  Exec(ExpandConstant('{sys}\sc.exe'), 'delete '+ServiceName, ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
  Result:= res = 0;
end;
 

Хамик

Старожил
Shegorat, Спасибо! Но здесь, наверное, требуется процедура, а не функция. Появляется вот такая ошибка:
2014-09-04_210328.jpg
И еще как по поводу ключа 'DfSdkS'?
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
И еще как по поводу ключа 'DfSdkS'?
Это и есть собственно ServiceName - идентификатор службы. Вся дальнейшая работа со службой будет происходить с помощью этого идентификатора. А ее отображаемое имя это ServiceDisplayName

Но здесь, наверное, требуется процедура, а не функция.
Ну да, забыл, тогда так
Код:
procedure DoServiceInstall(Path, ServiceName, ServiceDisplayName, ServiceDescription: String);
var
  res: Longint;
begin
  Exec(ExpandConstant('{sys}\sc.exe'), 'create '+ServiceName+' binPath= "'+ExpandConstant(Path)+'" DisplayName= "'+ServiceDisplayName+'"', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
  Exec(ExpandConstant('{sys}\sc.exe'), 'description '+ServiceName+' "'+ServiceDescription+'"', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
end;

procedure DoServiceUninstall(ServiceName: String);
var
  res: Longint;
begin
  Exec(ExpandConstant('{sys}\sc.exe'), 'delete '+ServiceName, ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
end;
 

Хамик

Старожил
Shegorat, Спасибо! Но что-то не получается. Служба не устанавливается. Я через AfterInstall в секции [Files] делаю или как-то по другому ваш код работает?
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
В чем-то конкретно проблема? Т.к. у меня на Win7 служба устанавливается. Хотя возможно требуются еще какие-то параметры, такие как тип службы, форма запуска и т.д.
 

Хамик

Старожил
В чем-то конкретно проблема? Т.к. у меня на Win7 служба устанавливается. Хотя возможно требуются еще какие-то параметры, такие как тип службы, форма запуска и т.д.
Спасибо! Мне уже подсказали что для таких служб существует два ключа командной строки "-install" и "-uninstall" и я сделал через секцию [Run].
 

Хамик

Старожил
В чем-то конкретно проблема?
Дошло почему не работает, там еще используется BeforeInstall: "DoServicePreInstall('DfSdkS')"; И для чего она без понятия..

Код:
Source: "{app}\DfSdkS.exe"; DestDir: "{app}"; Check: "not IsWin64"; BeforeInstall: "DoServicePreInstall('DfSdkS')"; AfterInstall: "DoServiceInstall('{app}\DfSdkS.exe', 'DfSdkS', 'Defragmentation-Service', 'Defrag Service - powered by mst software')"; MinVersion: 0.0,5.01.2600; Flags: ignoreversion
 

Shegorat

Lord of Madness
Администратор
Хамик
Ну тогда может лучше промониторить, какие действия выполняются при установке оригинального пакета. И исходя их этих данных уже делать функционал?
 

Shegorat

Lord of Madness
Администратор
Shegorat, а под "промониторить" что вы подразумеваете?
Ну есть специальные программы, которые позволяют отслеживать действия при установке программ, и исходя из этого уже делать выводы.
Вообще "sc create ..." только регистрирует службу в системе, но могут быть еще и другие необходимые действия для данной службы.
 
Сверху