InStall SerVice Demo


{      InStall SerVice Demo     }
{                               }
{      2011元旦By[haiou327]     }
{                               }
{                               }
var
  status: string;

function InstallService(PathName, Name, DisplayName: PChar): Boolean;
var
  schSCManager, schService: THANDLE;
  //strDir: array[0..1023] of char;
  //lpszBinaryPathName: PChar;
begin
  schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if schSCManager = 0 then
  begin
    MessageBox(0, '联接服务控制管理器失败', 'Error', MB_OK);
    Result := false;
    exit;
  end;
  //GetCurrentDirectory(1024, strDir); // 取到应用程序所在的目录
  //strlcat(strDir, '\ScvProject.exe', 1024); // 当前目录下的服务应用
  //lpszBinaryPathName := strDir;
  schService := CreateService(
    schSCManager, // 服务控制管理句柄
    Name, // 服务名称 需要和 服务应用名 相同
    DisplayName, // 显示的服务名称
    SERVICE_ALL_ACCESS, // 存取权利
    SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, // 服务类型 and SERVICE_INTERACTIVE_PROCESS
    SERVICE_AUTO_START, // 启动类型
    SERVICE_ERROR_NORMAL, // 错误控制类型
    PathName, // 服务程序
    nil, // 组服务名称
    nil, // 组标识
    nil, // 依赖的服务
    nil, // 启动服务帐号
    nil); // 启动服务口令
  if schService = 0 then
  begin
    MessageBox(0, '无法建立指定的服务对象', 'Error', MB_OK);
    Result := false; exit;
  end;
  CloseServiceHandle(schService);
  MessageBox(0, '已经成功地安装了服务对象', '信息', MB_OK);
  Result := true;
end;


function StartService(AServName: string): Boolean; //use WinSvc
var
  SCManager, hService: SC_HANDLE;
  lpServiceArgVectors: PChar;
begin
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  Result := SCManager <> 0;
  if Result then
  try
    hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
    Result := hService <> 0;
    if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then
      Exception.Create('The specified service does not exist');
    if hService <> 0 then
    try
      lpServiceArgVectors := nil;
      Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors));
      if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then
        Result := True;
    finally
      CloseServiceHandle(hService);
    end;
  finally
    CloseServiceHandle(SCManager);
  end;
end;


function StopService(AServName: string): Boolean;
var
  SCManager, hService: SC_HANDLE;
  SvcStatus: TServiceStatus;
begin
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  Result := SCManager <> 0;
  if Result then
  try
    hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
    Result := hService <> 0;
    if Result then
    try //停止并卸载服务;
      Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus);
      //删除服务,这一句可以不要;
     DeleteService(hService);
    finally
      CloseServiceHandle(hService);
    end;
  finally
    CloseServiceHandle(SCManager);
  end;
end;


function GetServiceStatusString(sServiceName: string): string;
var
  hService, hSCManager: SC_HANDLE;
  SS: TServiceStatus;
begin
  hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
  if hSCManager = 0 then
  begin
    result := 'Can not open the service control manager';
    exit;
  end;
  hService := OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS);
  if hService = 0 then
  begin
    CloseServiceHandle(hSCManager);
    result := 'Can not open the service';
    exit;
  end;
  if not QueryServiceStatus(hService, SS) then
    result := 'Can not query the service status'
  else
  begin
    case SS.dwCurrentState of
      SERVICE_CONTINUE_PENDING:
        result := 'continue is pending';
      SERVICE_PAUSE_PENDING:
        result := ' pause is pending';
      SERVICE_PAUSED:
        result := ' is paused';
      SERVICE_RUNNING:
        result := 'is running';
      SERVICE_START_PENDING:
        result := 'is starting';
      SERVICE_STOP_PENDING:
        result := 'is stopping';
      SERVICE_STOPPED:
        result := 'is not running';
    else
      result := 'Unknown Status';
    end;
  end;
  CloseServiceHandle(hSCManager);
  CloseServiceHandle(hService);
end;

procedure scanstatus;
begin
  begin
    status := GetServiceStatusString('test');
    //Form1.btn1.Caption:='安装服务';
    Form1.lbl1.Caption := status;
    Form1.btn1.Enabled := True;
    Form1.btn2.Enabled := True;
    Form1.btn3.Enabled := True;
    if status = 'is not running' then
    begin
      Form1.btn1.Caption:='服务已安装';
      Form1.btn3.Caption:='已停止...';
      Form1.btn2.Caption:='运行服务';
      Form1.btn1.Enabled := False;
      Form1.btn3.Enabled := False;
    end;
    if status = 'is running' then
    begin
      Form1.btn1.Caption:='服务已安装';
      Form1.btn2.Caption:='运行中...';
      Form1.btn3.Caption:='停止服务';
      Form1.btn1.Enabled := False;
      Form1.btn2.Enabled := False;
    end;
    if status = 'is starting' then
    begin
      Form1.btn1.Caption:='服务已安装';
      Form1.btn2.Caption:='运行中...';
      Form1.btn1.Enabled := False;
      Form1.btn2.Enabled := False;
    end;
    if status = 'Can not open the service' then
    begin
      Form1.btn1.Caption:='安装服务';;
      Form1.btn2.Caption:='运行服务';
      Form1.btn3.Caption:='停止服务';
      Form1.btn2.Enabled := False;
      Form1.btn3.Enabled := False;
    end;
  end;
end;


procedure TForm1.btn1Click(Sender: TObject);
begin
  InstallService(PChar(ExtractFileDir(ParamStr(0))+'\sct.exe'), 'Test', '0haiou');
  status := GetServiceStatusString('test');
  ScanStatus;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  if StartService('TEst') = True then
    ShowMessage('服务启动成功')
  else
    ShowMessage('error');
  scanstatus;
end;


procedure TForm1.btn3Click(Sender: TObject);
begin
  if StopService('TEst') = True then
    ShowMessage('成功停止')
  else
    ShowMessage('error');
  scanstatus;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  scanstatus;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值