未通过 CreateService 函数在 Inno Setup 中正确设置 DependsOn 的服务

问题描述 投票:0回答:1

我正在使用 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 个额外的“依赖项”并不作为服务存在。

有什么想法可能导致这种情况吗?

inno-setup pascalscript
1个回答
2
投票

正如CreateService

文档所述,
lpDependencies
参数需要是“双空终止”

所以,如果你的代码曾经有效,如果只是偶然的话。

这应该做:

Dependency := Dependency + #0;
© www.soinside.com 2019 - 2024. All rights reserved.