천객만래 [千客萬來] (It has an interminable succession of visitors)
[delphi] Starting and stopping Windows services

http://www.delphifaq.com/faq/delphi_windows_API/f521_0.htm

Note:
Thanks to Henk Mulder who mailed me about a correction with the assignment to dwCurrentState. I think this code was written originally with Delphi 3 and probably Borland or Microsoft changed something from a signed integer to an unsigned word. 

   
 { Thanks to Andrea Canu for pointing out a problem in this code (fixed now). }

program test;

uses
  WinSvc;

{sc-----------------------------------------------------------------------
  ServiceStart

  sMachine:
     machine name, ie: \\SERVER
     empty = local machine

  Purpose:
     start service
     return TRUE if successful
-----------------------------------------------------------------------sc}
function ServiceStart(sMachine, sService: String) : Boolean;
var
  schm,
  schs: SC_Handle;
  ss: TServiceStatus;
  psTemp: PChar;
  dwChkP: DWord;
begin
  ss.dwCurrentState := 1; // originally -1, corrected by Henk Mulder
  schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
  if (schm>0) then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_START or
      SERVICE_QUERY_STATUS);
    if (schs>0) then
    begin
      psTemp := nil;
      if (StartService(schs, 0, psTemp)) then
        if (QueryServiceStatus(schs, ss)) then
          while (SERVICE_RUNNING<>ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if (not QueryServiceStatus(schs, ss)) then
              Break;
            if (ss.dwCheckPoint < dwChkP) then
              Break;
          end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_RUNNING=ss.dwCurrentState;
end;


{sc-----------------------------------------------------------------------
  ServiceStop

  Purpose:
   stop a service, parameters as in ServiceStart
-----------------------------------------------------------------------sc}
function ServiceStop(sMachine, sService: String) : Boolean;
var
  schm,
  schs: SC_Handle;
  ss: TServiceStatus;
  dwChkP: DWord;
begin
  schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
  if (schm>0) then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_STOP or
      SERVICE_QUERY_STATUS);
    if (schs>0) then
    begin
      if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then
        if (QueryServiceStatus(schs, ss)) then
          while (SERVICE_STOPPED<>ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if (not QueryServiceStatus(schs, ss)) then
              Break;
            if (ss.dwCheckPoint < dwChkP) then
              Break;
          end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_STOPPED=ss.dwCurrentState;
end;


begin
  if (ServiceStart('\\ComputerName', 'alerter')) then
  begin

    // ..
  end;
  if (ServiceStop('', 'alerter')) then
  begin

    // ..
  end;
end. 

Posted by SB패밀리

윈도우즈 서비스 시작
sc start "내서비스"

윈도우즈 서비스 중지
sc stop "내서비스"

Posted by SB패밀리

닷넷 프레임워크 - 프로그래밍 방식으로 윈도우즈 서비스 작성
C#.NET 기준

Windows 서비스 프로젝트 템플릿을 사용하지 않고 상속 및 다른 인프라 요소를 직접 설정하여 독자적인 서비스를 작성할 수도 있습니다. 서비스를 프로그래밍 방식으로 만들 경우 템플릿을 통해 처리할 수 있는 몇 가지 단계를 직접 수행해야 합니다.

  • ServiceBase 클래스에서 상속하는 서비스 클래스를 설정해야 합니다.

  • 서비스 프로젝트에 Main 메서드를 만들어 서비스가 Run 메서드를 실행하고 호출하도록 정의해야 합니다.

  • OnStartOnStop 프로시저를 재정의하고 프로시저에서 실행할 모든 코드를 입력해야 합니다.

    Note참고

    Visual Studio Standard Edition에서는 Windows 서비스 템플릿과 관련 기능을 사용할 수 없습니다. 자세한 내용은 Visual Studio Edition을 참조하십시오.

프로그래밍 방식으로 서비스를 작성하려면

  1. 다음 단계에 따라 빈 프로젝트를 만들고 필요한 네임스페이스에 대한 참조를 만듭니다.

    1. 솔루션 탐색기에서 참조 노드를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.

    2. .NET Framework 탭에서 System.dll로 스크롤한 다음 선택을 클릭합니다.

    3. System.ServiceProcess.dll로 스크롤한 다음 선택을 클릭합니다.

    4. 확인을 클릭합니다.

  2. 클래스를 추가하고 ServiceBase에서 상속하도록 구성합니다.

     
    public class UserService1 : System.ServiceProcess.ServiceBase 
    {
    }

    public class UserService1 extends System.ServiceProcess.ServiceBase
    {
    }

  3. 다음 코드를 추가하여 서비스 클래스를 구성합니다.

     
    public UserService1()
    {
        this.ServiceName = "MyService2";
        this.CanStop = true;
        this.CanPauseAndContinue = true;
        this.AutoLog = true;
    }

    public UserService1()
    {
        this.set_ServiceName("MyService2");
        this.set_CanStop(true);
        this.set_CanPauseAndContinue(true);
        this.set_AutoLog(true);
    }

  4. 클래스에 대한 Main 메서드를 만들고 이를 사용하여 클래스에 포함될 서비스를 정의합니다. 클래스의 이름은 userService1입니다.

     
    public static void Main()
    {
        System.ServiceProcess.ServiceBase.Run(new UserService1());
    }

    public static void main()
    {
        System.ServiceProcess.ServiceBase.Run(new UserService1());
    }

  5. OnStart 메서드를 재정의한 다음 서비스를 시작할 때 발생시킬 모든 처리를 정의합니다.

     
    protected override void OnStart(string[] args)
    {
        // Insert code here to define processing.
    }

    J#
    protected void OnStart(System.String[] args)
    {
        // Insert code here to define processing.
    }

  6. 사용자 지정 처리로 정의할 다른 모든 메서드를 재정의한 다음 코드를 작성하여 각 경우에 서비스가 수행할 동작을 지정합니다.

  7. 서비스 응용 프로그램에 필요한 설치 관리자를 추가합니다. 자세한 내용은 방법: 서비스 응용 프로그램에 설치 관리자 추가를 참조하십시오.

  8. 빌드 메뉴에서 솔루션 빌드를 선택하여 프로젝트를 빌드합니다.

    Note참고

    F5 키를 눌러 프로젝트를 실행하지 마십시오. 이 방법으로는 서비스 프로젝트를 실행할 수 없습니다.

  9. 서비스를 설치할 사용자 지정 동작과 설치 프로젝트를 만듭니다. 예제를 보려면 연습: 구성 요소 디자이너에서 Windows 서비스 응용 프로그램 만들기를 참조하십시오.

  10. 서비스를 설치합니다. 자세한 내용은 방법: 서비스 설치 및 제거를 참조하십시오.

    출처: http://msdn.microsoft.com/ko-kr/library/76477d2t(v=VS.80).aspx

Posted by SB패밀리