::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2004-07-22 19:51:14, Hit : 6196, Vote : 1553
 http://www.howto.pe.kr
 윈도우즈 서비스 시작/중지 하기

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WinSvc, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

//
// start service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStart(
  sMachine,
  sService : string ) : boolean;
var
  //
  // service control
  // manager handle
  schm,
  //
  // service handle
  schs   : SC_Handle;
  //
  // service status
  ss     : TServiceStatus;
  //
  // temp char pointer
  psTemp : PChar;
  //
  // check point
  dwChkP : DWord;
begin
  ss.dwCurrentState := DWORD(-1);
  
  // connect to the service
  // control manager
  schm := OpenSCManager(
    PChar(sMachine),
    Nil,
    SC_MANAGER_CONNECT);

  // if successful...
  if(schm > 0)then
  begin
    // open a handle to
    // the specified service
    schs := OpenService(
      schm,
      PChar(sService),
      // we want to
      // start the service and
      SERVICE_START or
      // query service status
      SERVICE_QUERY_STATUS);

    // if successful...
    if(schs > 0)then
    begin
      psTemp := Nil;
      if(StartService(
           schs,
           0,
           psTemp))then
      begin
        // check status
        if(QueryServiceStatus(
             schs,
             ss))then
        begin
          while(SERVICE_RUNNING
            <> ss.dwCurrentState)do
          begin
            //
            // dwCheckPoint contains a
            // value that the service
            // increments periodically
            // to report its progress
            // during a lengthy
            // operation.
            //
            // save current value
            //
            dwChkP := ss.dwCheckPoint;

            //
            // wait a bit before
            // checking status again
            //
            // dwWaitHint is the
            // estimated amount of time
            // the calling program
            // should wait before calling
            // QueryServiceStatus() again
            //
            // idle events should be
            // handled here...
            //
            Sleep(ss.dwWaitHint);

            if(not QueryServiceStatus(
                 schs,
                 ss))then
            begin
              // couldn't check status
              // break from the loop
              break;
            end;

            if(ss.dwCheckPoint <
              dwChkP)then
            begin
              // QueryServiceStatus
              // didn't increment
              // dwCheckPoint as it
              // should have.
              // avoid an infinite
              // loop by breaking
              break;
            end;
          end;
        end;
      end;

      // close service handle
      CloseServiceHandle(schs);
    end;

    // close service control
    // manager handle
    CloseServiceHandle(schm);
  end;

  // return TRUE if
  // the service status is running
  Result :=
    SERVICE_RUNNING =
      ss.dwCurrentState;
end;

//
// stop service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStop(
  sMachine,
  sService : string ) : boolean;
var
  //
  // service control
  // manager handle
  schm,
  //
  // service handle
  schs   : SC_Handle;
  //
  // service status
  ss     : TServiceStatus;
  //
  // check point
  dwChkP : DWord;
begin
  // connect to the service
  // control manager
  schm := OpenSCManager(
    PChar(sMachine),
    Nil,
    SC_MANAGER_CONNECT);

  // if successful...
  if(schm > 0)then
  begin
    // open a handle to
    // the specified service
    schs := OpenService(
      schm,
      PChar(sService),
      // we want to
      // stop the service and
      SERVICE_STOP or
      // query service status
      SERVICE_QUERY_STATUS);

    // if successful...
    if(schs > 0)then
    begin
      if(ControlService(
           schs,
           SERVICE_CONTROL_STOP,
           ss))then
      begin
        // check status
        if(QueryServiceStatus(
             schs,
             ss))then
        begin
          while(SERVICE_STOPPED
            <> ss.dwCurrentState)do
          begin
            //
            // dwCheckPoint contains a
            // value that the service
            // increments periodically
            // to report its progress
            // during a lengthy
            // operation.
            //
            // save current value
            //
            dwChkP := ss.dwCheckPoint;

            //
            // wait a bit before
            // checking status again
            //
            // dwWaitHint is the
            // estimated amount of time
            // the calling program
            // should wait before calling
            // QueryServiceStatus() again
            //
            // idle events should be
            // handled here...
            //
            Sleep(ss.dwWaitHint);

            if(not QueryServiceStatus(
                 schs,
                 ss))then
            begin
              // couldn't check status
              // break from the loop
              break;
            end;

            if(ss.dwCheckPoint <
              dwChkP)then
            begin
              // QueryServiceStatus
              // didn't increment
              // dwCheckPoint as it
              // should have.
              // avoid an infinite
              // loop by breaking
              break;
            end;
          end;
        end;
      end;

      // close service handle
      CloseServiceHandle(schs);
    end;

    // close service control
    // manager handle
    CloseServiceHandle(schm);
  end;

  // return TRUE if
  // the service status is stopped
  Result :=
    SERVICE_STOPPED =
      ss.dwCurrentState;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 서비스 시작 하기(여기서는 DHCP 클라이언트로 테스트 했음)
  if( ServiceStart(
    '',
    'Dhcp' ) )then
  begin
    ShowMessage('DHCP Client service on the local computer was started');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // 서비스 중지 하기
  if( ServiceStop(
    '',
    'Dhcp' ) )then
  begin
    ShowMessage('DHCP Client service on the local computer was stopped');
  end;
end;

end.





211   [윈도우즈 API] 콤포넌트의 Hint 에 그림(Bitmap) 넣기  김영대 2003/04/11 5230 1360
210   [일반/컴포넌트] 키보드의 Shift+Tab 이 눌린것처럼 처리하기  김영대 2003/04/14 4766 1312
209   [윈도우즈 API] 폼이 Minimized 되었을때 깜박이게 하기 2  김영대 2003/04/14 6017 1324
208   [COM/OLE] 그리드 자료 엑셀로 좀더 빠르게 보내기  공성환 2003/04/16 5560 976
207   [일반/컴포넌트] C에서 한글자르기  공성환 2003/04/16 4880 973
206   [COM/OLE] 기존 Excel 문서 불러와서 편집후 저장하기  김영대 2003/04/18 5504 1293
205   [일반/컴포넌트] thread-safe Queue 구현  김영대 2003/08/18 6188 1361
204   [알고리즘] 숫자를 KB, MB, GB 단위로 환산하기  김영대 2003/11/13 5102 1172
203   [일반/컴포넌트] StrToFloatDef  김영대 2003/11/13 5001 1259
202   [알고리즘] 구분자(delimiter)를 사용한 문자열 파싱(parsing)  김영대 2003/11/13 5207 1149
201   [일반/컴포넌트] thread-safe Queue를 이용한 TLogThread  김영대 2003/11/18 4854 1143
200   [네트웍/인터넷] IOCP(I/O Completion Port) class  김영대 2003/11/18 11080 884
199   [네트웍/인터넷] Winsock WriteFile and Overlapped IO  김영대 2003/11/18 5461 1235
198   [시스템] 윈도우즈 서비스 목록 구하기  김영대 2004/07/22 4627 1240
197   [시스템] 윈도우즈 서비스 상태 구하기  김영대 2004/07/22 5035 1284
  [시스템] 윈도우즈 서비스 시작/중지 하기  김영대 2004/07/22 6196 1553
195   [시스템] 윈도우즈 시스템의 스크롤바 두께 바꾸기  김영대 2004/07/24 5658 1386
194   [시스템] 마우스 아래의 윈도우 핸들 구하기  김영대 2004/07/24 9451 1984
193   [시스템] 내 프로그램의 실행 우선순의 바꾸기  김영대 2004/07/24 5154 1399
192   [윈도우즈 API] 내 프로그램의 화면을 가리는 프로그램 리스트  김영대 2004/07/24 4597 1210
191   [윈도우즈 API] Taskbar 의 특정 위치에 popup 메뉴 띄우기  김영대 2004/07/24 4626 1207
190   [윈도우즈 API] Taskbar 의 위치 추적하기  김영대 2004/07/24 4029 1072
189   [일반/컴포넌트] 윈도우즈"시작" 버튼위에 글씨 쓰기  김영대 2004/07/24 4210 1156
188   [시스템] 제어판의 모든 applet 정보 구하기  김영대 2004/07/24 4458 1141
187   [윈도우즈 API] 바로 직전에 active 되었던 윈도우와 콘트롤 구하기  김영대 2004/07/24 4667 1175
186   [윈도우즈 API] 지원하는 키보드 입력 언어 구하고 변경하기  김영대 2004/07/24 4767 1275
185   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 5016 1364
184   [COM/OLE] 윈도우즈 "작업 표시줄 및 시작 메뉴 등록 정보" 화면  김영대 2004/07/25 6103 1639
183   [COM/OLE] 윈도우즈 "인터넷 등록 정보" 화면  김영대 2004/07/25 4279 1331
182   [COM/OLE] 윈도우즈 "날짜/시간 등록 정보" 화면  김영대 2004/07/25 6424 1654
181   [COM/OLE] 윈도우즈 "검색: 파일 또는 폴더" 화면  김영대 2004/07/25 5005 1402
180   [COM/OLE] 윈도우즈 "시스템 종료" 화면  김영대 2004/07/25 4621 1312
179   [COM/OLE] 윈도우즈 "모든 창을 최소화"  김영대 2004/07/25 6263 1717
178   [일반/컴포넌트] TList 를 이용한 stack 구조 구현  김영대 2004/07/25 4401 1146
177   [윈도우즈 API] 폼에 애니메이션 효과 주기  김영대 2004/07/25 4685 1240
176   [일반/컴포넌트] 모서리가 둥근(rounded ends) TMemo 만들기  김영대 2004/07/25 4628 1191
175   [시스템] 로컬 가상 드라이버(substitution device) 만들고 제거하기  김영대 2004/07/25 6143 1335
174   [네트웍/인터넷] 네트워크 드라이브 연결 화면 띄우기  김영대 2004/07/26 5979 1609
173   [일반/컴포넌트] TProgressbar 의 색상 바꾸기  김영대 2004/07/26 4646 1242
172   [일반/컴포넌트] TTrewView, TListView 를 이미지로 저장하기  김영대 2004/07/26 4372 965

[이전 10개] [1]..[11][12][13][14][15][16][17][18][19] 20 ..[25] [다음 10개]
 

Copyright 1999-2022 Zeroboard / skin by zero