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

解決


stop  2007-04-10 08:49:53  No: 25711  IP: 192.*.*.*

サービス(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 10:48:01  No: 25712  IP: 192.*.*.*

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

編集 削除
stop  2007-04-10 11:38:35  No: 25713  IP: 192.*.*.*

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

編集 削除
にしの  2007-04-10 13:17:56  No: 25714  IP: 192.*.*.*

ついでなので、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 13:18:38  No: 25715  IP: 192.*.*.*

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

編集 削除
stop  2007-04-10 13:43:13  No: 25716  IP: 192.*.*.*

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

編集 削除