サービス(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
このあたりを参考に
http://winofsql.jp/c/startingtaskscheduler.htm
https://www.petitmonte.com/bbs/answers?question_id=853
にしのさんのコードでステイタスは取得できましたが、Cのコードは手に負えません。壁が高すぎました。give up・・・;
ofZ様、有難うございました。
ついでなので、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;
追記。
usesにwinsvcを追加しておいてください。
御教示いただきましたソースで解決できました。
にしの様に無限の感謝をいたします。
ありがとうございました。
ツイート | ![]() |