我正在使用 Inno Setup 为我的应用程序创建一个安装程序,作为安装的一部分,它需要安装多个服务。为此,我使用以下代码:
Dependency := '';
if Depends then begin
Dependency := 'DependencyServiceName';
end;
if not IsServiceInstalled(ServiceName) then begin
if not InstallService(
'"' + Path + '"', ServiceName, ServiceName, Description,
SERVICE_WIN32_OWN_PROCESS, StartType, False, Dependency) then begin
Result := False;
FailedSoExit('Failed to install the ' + Name + ' service.');
Exit;
end;
end;
相关方法是:
function CreateService(hSCManager :HANDLE;lpServiceName, lpDisplayName: string;dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl: cardinal;lpBinaryPathName,lpLoadOrderGroup: String; lpdwTagId : cardinal;lpDependencies,lpServiceStartName,lpPassword :string): cardinal;
external '[email protected] stdcall';
function InstallService(
FileName, ServiceName, DisplayName, Description : string;
ServiceType,StartType : cardinal; Delayed : Boolean;
Dependency: String) : Boolean;
var
hSCM : HANDLE;
hService : HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := CreateService(
hSCM,ServiceName,DisplayName,SERVICE_ALL_ACCESS,ServiceType,StartType,0,FileName,'',0,Dependency,'','');
if hService <> 0 then begin
Result := true;
// Win2K & WinXP supports aditional description text for services
if Description<> '' then
RegWriteStringValue(HKLM,'System\CurrentControlSet\Services\' + ServiceName,'Description',Description);
if Delayed then
RegWriteDWordValue(HKLM,'System\CurrentControlSet\Services\' + ServiceName,'DelayedAutostart',1);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
这一直有效,即使现在当我运行编译器时,一切都可以正常工作,并且
Dependency
具有正确的名称。然而,在我安装它的测试机器上,现在似乎在它后面添加了随机的东西,所以注册表中的 DependsOn 看起来像这样(其中 {installPath}
是 Inno Setup 安装它的路径):
DependencyServiceName
£$%
)
{installPath}
这显然会导致服务无法启动,因为 3 个额外的“依赖项”并不作为服务存在。
有什么想法可能导致这种情况吗?