安裝與刪除指定Service (转)

博客给出了服务安装和卸载的函数代码。InstallService 函数用于安装服务,会处理多种错误情况;unInstallService 函数用于卸载服务,也会处理相应错误。还展示了按钮点击调用这两个函数的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

function InstallService(SvcName, SvcDispName, SvcFullPath: string): integer;
var
  hSCM, hService: SC_HANDLE;
  sInfo: string;
begin
  result := 0;
  hSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if hSCM = 0 then
  begin
    result := GetLastError;
    {$IFDEF DEBUG}
    ShowMessage(SysErrorMessage(result));
    {$ENDIF}
    exit;
  end; 
  try
    hService := CreateService(hSCM,
      PChar(SvcName),
      PChar(SvcDispName),
      SERVICE_ALL_ACCESS, //SERVICE_START OR SERVICE_QUERY_STATUS OR _DELETE,
      SERVICE_WIN32_OWN_PROCESS,
      SERVICE_DEMAND_START, //SERVICE_AUTO_START,
      SERVICE_ERROR_NORMAL,
      PChar(SvcFullPath),
      nil, nil, nil, nil, nil);

    if hService = 0 then
    begin
      result := GetLastError;
      {$IFDEF DEBUG}
      ShowMessage(SysErrorMessage(result));
      {$ENDIF}
      case result of
        ERROR_ACCESS_DENIED: sInfo := 'ERROR_ACCESS_DENIED';
        ERROR_CIRCULAR_DEPENDENCY: sInfo := 'ERROR_CIRCULAR_DEPENDENCY';
        ERROR_DUPLICATE_SERVICE_NAME: sInfo := 'ERROR_DUPLICATE_SERVICE_NAME';
        ERROR_INVALID_HANDLE: sInfo := 'ERROR_INVALID_HANDLE';
        ERROR_INVALID_NAME: sInfo := 'ERROR_INVALID_NAME';
        ERROR_INVALID_PARAMETER: sInfo := 'ERROR_INVALID_PARAMETER';
        ERROR_INVALID_SERVICE_ACCOUNT: sInfo := 'ERROR_INVALID_SERVICE_ACCOUNT';
        ERROR_SERVICE_EXISTS: sInfo := 'ERROR_SERVICE_EXISTS';
      end;
      {$IFDEF DEBUG}
      ShowMessage(sInfo);
      {$ENDIF}
    end
    else
      CloseServiceHandle(hService);
  finally
    CloseServiceHandle(hSCM);
  end;
end;

function unInstallService(SvcName: string): boolean;
var
  hSCM, hService: SC_HANDLE;
  ErCode: DWord;
begin
  Result := false;
  hSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if hSCM = 0 then
  begin
    ErCode := GetLastError;
    {$IFDEF DEBUG}
    ShowMessage(SysErrorMessage(ErCode));
    {$ENDIF}
    exit;
  end;
  try
    hService := OpenService(hSCM, PChar(SvcName),
      SERVICE_ALL_ACCESS);
    if hService = 0 then
    begin
      ErCode := GetLastError;
      {$IFDEF DEBUG}
      ShowMessage(SysErrorMessage(ErCode));
      {$ENDIF}
      exit;
    end;
    result := DeleteService(hService);
    if not result then
    begin
      ErCode := GetLastError;
      case ErCode of
        ERROR_ACCESS_DENIED: ;
        ERROR_INVALID_HANDLE: ;
        ERROR_SERVICE_MARKED_FOR_DELETE: ;
      end;
      {$IFDEF DEBUG}
      ShowMessage(SysErrorMessage(ErCode));
      {$ENDIF}
    end;

    CloseServiceHandle(hService);
  finally
    CloseServiceHandle(hSCM);
  end;
end;

procedure TForm1.btnInstallServiceClick(Sender: TObject);
begin
  InstallService('Service1', 'Ari''s Service1', 'G:/test/service/AriSerApp.exe');
end;

procedure TForm1.btnDelServiceClick(Sender: TObject);
begin
  if unInstallService('Service1') then
    ShowMessage('unInstall Service success');
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值