除了接受的答案,我只想讓人們更容易使用Luigi Sandon的服務庫(非常感謝!)。下載腳本後,您就需要添加一個[代碼]類似於以下到你的安裝腳本部分:
[Code]
// source: https://stackoverflow.com/a/5416744
#include "services_unicode.iss"
const
SERVICE_NAME = 'MyService';
SERVICE_DISPLAY_NAME = 'MyService';
SERVICE_EXE = 'MyService.exe';
procedure CurStepChanged(CurStep: TSetupStep);
begin
Log('CurStepChanged(' + IntToStr(Ord(CurStep)) + ') called');
if CurStep = ssInstall then begin
if ServiceExists(SERVICE_NAME) then begin
if SimpleQueryService(SERVICE_NAME) = SERVICE_RUNNING then begin
SimpleStopService(SERVICE_NAME, True, False);
end;
SimpleDeleteService(SERVICE_NAME);
end;
end
else if CurStep = ssPostInstall then begin
SimpleCreateService(SERVICE_NAME, SERVICE_DISPLAY_NAME, ExpandConstant('{app}\' + SERVICE_EXE), SERVICE_AUTO_START, '', '', False, False);
SimpleStartService(SERVICE_NAME, True, False);
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
Log('CurUninstallStepChanged(' + IntToStr(Ord(CurUninstallStep)) + ') called');
if CurUninstallStep = usUninstall then begin
if ServiceExists(SERVICE_NAME) then begin
if SimpleQueryService(SERVICE_NAME) = SERVICE_RUNNING then begin
SimpleStopService(SERVICE_NAME, True, False);
end;
SimpleDeleteService(SERVICE_NAME);
end;
end;
end;
這不是防彈的,但應該處理絕大多數情況下就好了。
不幸的是我無法弄清楚是否有使用{# VarName}
發出的[代碼]部分的語法,這就是爲什麼我宣佈服務名稱等作爲常量有以及#define
的一種方式在文件的頂部。答案here很有用如果你想要的常數是[Setup]部分的設置之一,但是因爲你不能隨意添加東西到這個部分,所以你不想爲所有的東西定義常量。
如果您想爲您服務的描述,則服務庫不支持,但是這是很容易使用[註冊]部分做的,例如:
[Registry]
; set the service description
Root: HKLM; Subkey: "System\CurrentControlSet\Services\{#ServiceName}"; ValueType: string; ValueName: "Description"; ValueData: "{#ServiceDescription}"; Flags: deletevalue uninsdeletekey
最後,我可以確認這也適用於Windows 10。
服務可以在安裝後立即運行,我一直這樣做。儘管如果安裝程序必須替換正在使用的文件,可能需要重新引導。 – 2011-03-24 07:46:22
如果我記得,安裝服務的建議不是使用服務的自行安裝,而是直接從安裝程序寫入所有註冊表項。 – 2011-03-24 07:55:22
AFAIK您應該使用SCM(服務控制管理器)API來安裝服務,而不是訪問註冊表。 – 2011-03-24 08:48:07