サービスを停止するには?

解決


stop  2007-04-10 17:49:53  No: 25711

サービス(Microsoft Management Console)を起動して、MSSQLSERVERを選択して停止させる、
これをDelphiから行うにはどう記述すればいいのですか?

Uses ShellAPI」
ShellExecute(0, 'open',PChar('c:\windows\system32\services.msc'), nil, nil, SW_NORMAL);
でサービスは起動できました。

環境:WinXp-home(sp2),Delphi7-pro


ofZ  2007-04-10 19:48:01  No: 25712

このあたりを参考に
http://winofsql.jp/c/startingtaskscheduler.htm
https://www.petitmonte.com/bbs/answers?question_id=853


stop  2007-04-10 20:38:35  No: 25713

にしのさんのコードでステイタスは取得できましたが、Cのコードは手に負えません。壁が高すぎました。give up・・・;
ofZ様、有難うございました。


にしの  2007-04-10 22:17:56  No: 25714

ついでなので、QueryStatus、StartService、ControlServiceのサンプルを作ってみました。
サービスの停止はControlServiceで行います。

procedure TForm1.QueryStatusClick(Sender: TObject);
var
  service: TServiceStatus;
  mhnd, shnd: SC_HANDLE;
begin
  mhnd := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if mhnd = 0 then
  begin
    Memo1.Lines.Add('OpenSCManager failed.');
    Exit;
  end;
  shnd := OpenService(mhnd, PChar(Edit1.Text), SERVICE_ALL_ACCESS);
  if shnd = 0 then
  begin
    Memo1.Lines.Add('OpenService failed.');
    CloseServiceHandle( mhnd );
    Exit;
  end;
  if QueryServiceStatus(shnd, service) then
  begin
    case service.dwCurrentState of
    SERVICE_STOPPED:          Memo1.Lines.Add('Stoped');
    SERVICE_START_PENDING:    Memo1.Lines.Add('Start Pending');
    SERVICE_STOP_PENDING:     Memo1.Lines.Add('Stop Pending');
    SERVICE_RUNNING:          Memo1.Lines.Add('Running');
    SERVICE_CONTINUE_PENDING: Memo1.Lines.Add('Continue Pending');
    SERVICE_PAUSE_PENDING:    Memo1.Lines.Add('Pause Pending');
    SERVICE_PAUSED:           Memo1.Lines.Add('Paused');
    end;
  end;
  CloseServiceHandle( shnd );
  CloseServiceHandle( mhnd );
end;

procedure TForm1.ServiceStartClick(Sender: TObject);
var
  service: TServiceStatus;
  mhnd, shnd: SC_HANDLE;
  arg: PAnsiChar;
begin
  mhnd := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if mhnd = 0 then
  begin
    Memo1.Lines.Add('OpenSCManager failed.');
    Exit;
  end;
  shnd := OpenService(mhnd, PChar(Edit1.Text), SERVICE_ALL_ACCESS);
  if shnd = 0 then
  begin
    Memo1.Lines.Add('OpenService failed.');
    CloseServiceHandle( mhnd );
    Exit;
  end;
  arg := nil;
  if StartService(shnd, 0, arg) then
  begin
    //成功
    Memo1.Lines.Add('Service Start OK.');
  end
  else
  begin
    //失敗
    Memo1.Lines.Add('Service Start NG.');
  end;
  CloseServiceHandle( shnd );
  CloseServiceHandle( mhnd );
end;

procedure TForm1.ServiceStopClick(Sender: TObject);
var
  service: TServiceStatus;
  mhnd, shnd: SC_HANDLE;
  arg: PAnsiChar;
begin
  mhnd := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if mhnd = 0 then
  begin
    Memo1.Lines.Add('OpenSCManager failed.');
    Exit;
  end;
  shnd := OpenService(mhnd, PChar(Edit1.Text), SERVICE_ALL_ACCESS);
  if shnd = 0 then
  begin
    Memo1.Lines.Add('OpenService failed.');
    CloseServiceHandle( mhnd );
    Exit;
  end;
  arg := nil;
  if ControlService(shnd, SERVICE_CONTROL_STOP, service) then
  begin
    //成功
    Memo1.Lines.Add('Service Stop OK.');
  end
  else
  begin
    //失敗
    Memo1.Lines.Add('Service Stop NG.');
  end;
  CloseServiceHandle( shnd );
  CloseServiceHandle( mhnd );
end;


にしの  2007-04-10 22:18:38  No: 25715

追記。
usesにwinsvcを追加しておいてください。


stop  2007-04-10 22:43:13  No: 25716

御教示いただきましたソースで解決できました。
にしの様に無限の感謝をいたします。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加