線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1738
推到 Plurk!
推到 Facebook!

在xp有沒有辦法用編程實現'停用服務'

答題得分者是:qoo1234
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-16 16:54:42 IP:203.218.xxx.xxx 未訂閱
有沒有辦法用編程實現'系統管理工具---服務----某個服務---內容-----停用'這個動作呢? 我用的是win xp系統
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-16 17:11:39 IP:220.131.xxx.xxx 未訂閱
net stop [服務名稱]   ex. net stop mysql    網海無涯,唯學是岸!
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-16 17:38:52 IP:218.102.xxx.xxx 未訂閱
執行net stop ...指令,提示:'這項服務無法接受要求的'暫停'或'停止'動作 我是要把服務的啟動類型由'自動'改為'已停用'或'手動' 請再指教
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-16 18:16:19 IP:220.131.xxx.xxx 未訂閱
http://www.swissdelphicenter.ch/torry/showcode.php?id=1322    網海無涯,唯學是岸!
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-17 16:00:18 IP:219.77.xxx.xxx 未訂閱
這好像在NT下才有用. 我用的是xp.
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-17 17:11:52 IP:220.131.xxx.xxx 未訂閱
XP可以正常使用阿... < class="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,ServiceManager, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; myService:TServiceManager; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin myService.Connect(nil); myService.OpenServiceConnection(PChar('Alerter')); if myService.StartService then ShowMessage('Start Service:Alerter'); end; procedure TForm1.Button2Click(Sender: TObject); begin if myService.StopService then ShowMessage('Stop Service:Alerter'); end; procedure TForm1.FormCreate(Sender: TObject); begin myService:=TServiceManager.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin myService.Free; end; end. 網海無涯,唯學是岸!
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-17 17:32:19 IP:203.218.xxx.xxx 未訂閱
再請問一下如何列舉出所有的服務名和顯示名稱到listbox裡? 謝謝.
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-17 17:37:06 IP:220.131.xxx.xxx 未訂閱
參考看看 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 其他方式你還是找點資料...不然只能用註冊表方式    網海無涯,唯學是岸!
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-17 19:01:22 IP:203.218.xxx.xxx 未訂閱
還有一問: 我想讓服務不要在開機會啟動,也就是把服務的啟動類型由'自動'改為'已停用'又該如何寫呢? procedure TServiceManager.DisableService; begin { Implementation is following... } end;
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-17 19:58:50 IP:220.131.xxx.xxx 未訂閱
ServiceManager.pas
unit ServiceManager;    interface    uses
  SysUtils, Windows, WinSvc;    type
  TServiceManager = class
  private
    { Private declarations }
    ServiceControlManager: SC_Handle;
    ServiceHandle: SC_Handle;
  protected
    function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
  public
    { Public declarations }
    function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil;
      Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean;  // Access may be SC_MANAGER_ALL_ACCESS
    function OpenServiceConnection(ServiceName: PChar): Boolean;
    function StartService: Boolean; overload; // Simple start
    function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
      overload; // More complex start
    function StopService: Boolean;
    procedure PauseService;
    procedure ContinueService;
    procedure ShutdownService;
    procedure DisableService(ServiceName: PChar);
    function GetStatus: DWORD;
    function ServiceRunning: Boolean;
    function ServiceStopped: Boolean;
  end;    implementation    { TServiceManager }    function TServiceManager.Connect(MachineName, DatabaseName: PChar;
  Access: DWORD): Boolean;
begin
  Result := False;
  { open a connection to the windows service manager }
  ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access);
  Result := (ServiceControlManager <> 0);
end;    function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean;
begin
  Result := False;
  { open a connetcion to a specific service }
  ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS);
  Result := (ServiceHandle <> 0);
end;    procedure TServiceManager.PauseService;
var
  ServiceStatus: TServiceStatus;
begin
  { Pause the service: attention not supported by all services }
  ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus);
end;    function TServiceManager.StopService: Boolean;
var
  ServiceStatus: TServiceStatus;
begin
  { Stop the service }
  Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus);
end;    procedure TServiceManager.ContinueService;
var
  ServiceStatus: TServiceStatus;
begin
  { Continue the service after a pause: attention not supported by all services }
  ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus);
end;    procedure TServiceManager.ShutdownService;
var
  ServiceStatus: TServiceStatus;
begin
  { Shut service down: attention not supported by all services }
  ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus);
end;    function TServiceManager.StartService: Boolean;
begin
  Result := DoStartService(0, '');
end;    function TServiceManager.StartService(NumberOfArgument: DWORD;
  ServiceArgVectors: PChar): Boolean;
begin
  Result := DoStartService(NumberOfArgument, ServiceArgVectors);
end;    function TServiceManager.GetStatus: DWORD;
var
  ServiceStatus: TServiceStatus;
begin
{ Returns the status of the service. Maybe you want to check this
  more than once, so just call this function again.
  Results may be: SERVICE_STOPPED
                  SERVICE_START_PENDING
                  SERVICE_STOP_PENDING
                  SERVICE_RUNNING
                  SERVICE_CONTINUE_PENDING
                  SERVICE_PAUSE_PENDING
                  SERVICE_PAUSED   }
  Result := 0;
  QueryServiceStatus(ServiceHandle, ServiceStatus);
  Result := ServiceStatus.dwCurrentState;
end;    procedure TServiceManager.DisableService(ServiceName: PChar);
var
   scMngr: THandle;
   scSvc: THandle;
begin
  scMngr:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  scSvc:= OpenService(scMngr, ServiceName, SERVICE_CHANGE_CONFIG);
  ChangeServiceConfig(scSvc,
                      SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE,
                      nil,nil,nil,nil,nil,nil,nil);
  CloseServiceHandle(scSvc);
end;    function TServiceManager.ServiceRunning: Boolean;
begin
  Result := (GetStatus = SERVICE_RUNNING);
end;    function TServiceManager.ServiceStopped: Boolean;
begin
  Result := (GetStatus = SERVICE_STOPPED);
end;    function TServiceManager.DoStartService(NumberOfArgument: DWORD;
  ServiceArgVectors: PChar): Boolean;
var
  err: integer;
begin
  Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors);
end;    end.    Demo 
procedure TForm1.Button3Click(Sender: TObject);
begin
 myService.DisableService(PChar('Alerter'));
end;
 
網海無涯,唯學是岸!
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-18 15:53:12 IP:203.218.xxx.xxx 未訂閱
十分感謝...
系統時間:2024-05-03 2:02:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!