::: 강좌/소스/문서 :::

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


Category

  구창민(2003-03-14 12:31:11, Hit : 7067, Vote : 1410
 http://www.delphi.pe.kr
 [강좌] Window NT/2000 의 서비스 어플리케이션의 작성

[강좌] Window NT/2000 의 서비스 어플리케이션의 작성

서비스 어플리케이션의 작성


안녕하세요~ 구창민입니다.

아래 강좌는 예전에 델파이 코리아의 뉴스레더에 실었던 내용인데, 이곳에 없는거 같아 올려봅니다.

저자는 저 구창민이구여, 아무곳이나 퍼서 널으셔도 상관없습니다.

그럼, 시작하도록 하겠습니다.

NT 에서 데몬으로 작동하는 서비스 어플리케이션을 작성하는데 필요한 도움될 글을 몇자 적어보았습니다.

서비스 어플리케이션을 작성하려면 몇가지 방법이 있습니다.

우선 Delphi 에서 제공하는 두가지 방법을 들면,

서비스 어플리케이션의 Event 인 Execute 에서 동작하게 하는 방식과

새로운 Thread 를 생성해서 동작하게 하는 방식이 있습니다.

또다른 방법은 각 종 써드파티를 이용하는 방법이겠지요.

제 기억에는 Delphi4 이전 버젼들에서는 서비스 어플리케이션을 작성하기에 좀 까다로웠던 기억이 있습니다.

해서, 써드파티를 이용해서 작성했던 기억이 나네요.

그럼, Delphi 에서 어떻게 서비스 어플리케이션을 작성할 수 있도록 지원하는 지를 알아보도록 하겠습니다.

Delphi는 서비스 어플리케이션을 작성할 수 있도록 VCL 을 제공하는데,

SvcMgr 과 WinSvc 이 있습니다.

SvcMgr 은 서비스 어플리케이션을  구현할 수 클래스와 멤버함수들을 정의해 둔것이며,

WinSvc 는 Windows API 함수들을 포팅해둔 유닛입니다.

아래 만드는 방법을 제시할 것이므로, 알고만 계시길 바랍니다.


자, 그럼 이제 실제로 서비스 어플리케이션을 작성해 볼까요?

먼저 Delphi IDE Menu 에서 File/New 를 선택하시고

Service Application을 선택하시면 서비스 어플리케이션을 만들 수 있는 골격이 갖추어 집니다.

TServiceAppliction 타입의 Application 이라는 전역변수가 프로젝트에 추가됩니다.

TService 윈도우가 나타날것입니다.

또한, 서비스를 SvrMgr을 보시면 아시겠지만, 서비스 어플리케이션은 이미 자체가 쓰레드 입니다.

해서 OnExecute 이벤트 핸들러를 작성만 해 주셔도 어플리케이션이 작동합니다.

하지만 자신이 생성한 쓰레드로 동작시키는 것이 더 좋은 방법이겠지요.

그것은 메인 쓰레드에서 처리하는 동작을 기다리지 않고 새로운 동작들을 감행 할 수 있기 때문입니다.

그럼, 아래 코드를 보고 차근차근 이벤트를 만들어 내용들을 삽입하세요.

먼저 쓰레드를 만들구, 그 다음 쓰레드를 동작시키는 부분들을 Service 의

이벤트 핸들러들을 생성해 기술 해 주신다음,

Service 의 프로퍼티 중 Interactive 속성을 True 로 만들어 주신후 컴파일 하시면 됩니다.

이넘이 데스크 탑과 상호작용을 하게 해 줍니다. 안하면 WinAPI 를 쓰는데 제약이 따릅니다.

아래 쏘스는 모든 윈도그 창들의 IME 를 Kill 해주는 동작을 합니다.

IME를 왜 Kill 하냐구요? 음. 필자의 취지와는 벗어나는 설명이지만 이해를 위해 몇자 기술하겠습니다.

IME 윈도그는 모든 윈도그에 다 생성됩니다.

즉 모든 윈도그가 IME를 각기 가지고 있다고 보시면 되는거죠.

그런데 예를 들어 강의할때나 영화를 관람할 때 쓰이는 빔 프로젝트를 설치하고,

상영에 필요한 프로그램(상용)을 실행할때 나타나는 IME 윈도그들은 사라지지가 않습니다.

물론, 트레이 아이콘의 IME 상태표시를 체크하지 않아도 말이죠.

해서 이런 프로그램을 작성해서 깔끔히 없애 버리는데 성공을 했습니다.

정법은 아닌듯 합니다만, 제가 아는 지식이 짧기 때문에 일단 구현을 목적으로

한것이니 불만족 스럽더라도 서비스 어플리케이션작성에 의미를 두고 따라해 보시길 바랍니다.

Make 해서 서비스 어플리케이션이 생성되었나요?

그럼, 서비스어플리케이션을 설치하기 위해 사용하는 도스 명령어를 소개하겠습니다.

도스 창을 열고 아래대로 기술 하시면 됩니다.

물론 서비스 설치후 제어판에서 서비스를 열어서 찾은 다음 실행 과 중지 는 똑같은 결과가 나오긴 합니다만,

그래도 설치할때는 도스창에서 직접 하셔야 합니다.

[설치] 실행파일명 /install /silent <-- 이 두가지 옵션은 설치하면서 메세지가 나타나지 않게 함.

[실행] net start 서비스Display 명(제어판의 서비스 목록중에 더블클릭해서 보면 그 이름이 나옴)

[중지] net stop 서비스Display 명.

[삭제] 실행파일명 /uninstall /silent <-- silent 옵션을 사용하지 않으면 설치 메세지가 나옴.


자 그럼, 아래는 소스입니다.



{**********************************************************}
{                                                          }
{     IME Kill NT Service Appication                       }
{                                                          }
{     Copyright (c)g 2001 INZEN                            }
{     Written by KOO, CHANG MIN                            }
{                                                          }
{     Email: kcm@inzen.com                                 }
{     Comment : Service 의 Interactive = True              }
{     Desk Top 과 상호작용.  Win32 SDK 의 사용제약때문     }
{**********************************************************}

unit Main;

interface

uses
  SvcMgr,
  Windows,
  Messages,
  Classes,
  IMM, ExtCtrls, Dialogs,
  SysUtils;


type
  TIMEKillThread = class(TThread)
  private
  public
    procedure Execute; override;
  end;

  TImeKillService = class(TService)
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  ImeKillService: TImeKillService;
  IMEKillThread : TIMEKillThread;

implementation

{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ImeKillService.Controller(CtrlCode);
end;
//------------------------------------------------------------------------------


function TImeKillService.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
//------------------------------------------------------------------------------


procedure TImeKillService.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
  IMEKillThread := TIMEKillThread.Create(False);
  IMEKillThread.FreeOnTerminate := True;
  IMEKillThread.Priority := tpIdle;
  Started := True;
end;
//------------------------------------------------------------------------------


procedure TImeKillService.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  Continued := True;
  IMEKillThread.Resume;
end;
//------------------------------------------------------------------------------


procedure TImeKillService.ServicePause(Sender: TService;
  var Paused: Boolean);
begin
  IMEKillThread.Suspend;
  Paused := False;
end;
//------------------------------------------------------------------------------


procedure TImeKillService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  IMEKillThread.Terminate;
  Stopped := True;
end;
//------------------------------------------------------------------------------


procedure TIMEKillThread.Execute;
var
  IMEHandle : HWND;
begin
  while not Terminated do
  begin
    IMEHandle := ImmGetDefaultIMEWnd(GetForeGroundWindow);
    if IMEHandle <> 0 then PostMessage(IMEHandle, WM_CLOSE, 0, 0);
    SleepEx(200, True);
  end;
end;
//------------------------------------------------------------------------------


end.

서비스가 설치되고 실행하시면 더이상 IME 창이 나타나지 않을 겁니다.

그러면 성공적으로 서비스가 설치되고 동작되고 있는 것입니다.

서비스를 UnIntall 하고 싶으시면 위에 기술한 도스 명령어를 참조 하시구요.

참고로, 서비스 디버깅 하는 방법을 조금 기술하겠습니다.

이것은 Borland 에서 제공하는 Delphi5 개발자 안내서를 참고하였습니다.

1. 먼저 디버거 안에서 어플리케이션을 실행하고 로딩이 끝나기를 기다린다.

2. 제어판이나, 커맨드 라인에서 빨리 서비스를 시작한다.

net start 서비스 명

서비스를 아주 빨리 실행해야 한다.(15~30) 초 이내, 서비스 어플리케이션은

서비스가 실행되고 난 후 바로 종료되기 때문이다. (이것은 제가 직접 확인해보았습니다. 사실입니다.)

지금 까지 구창민이였습니다~~

그럼~ 항상 즐거운 프로그래밍 하시길~~~







  [Delphi] [강좌] Window NT/2000 의 서비스 어플리케이션의 작성  구창민 2003/03/14 7067 1410
54   [Delphi] [소스] Internet Explorer 의 즐겨찾기 정보 읽어오기  김영대 2003/03/11 6393 1627
53   [Delphi] [소스] Outlook Express 의 주소록(WAB) 정보 읽어오기  김영대 2003/03/11 6363 1720
52   [Delphi] [소스] 윈도우즈 공유폴더 만들고 해제하기  김영대 2003/03/11 7202 1729
51   [Delphi] [소스] 상대방 컴퓨터의 IP 구하기  김영대 2003/03/11 7990 1757
50   [Delphi] [소스] 네트워크 환경의 TCP/IP 등록정보 읽어오기  김영대 2003/03/11 6895 1753
49   [Delphi] [소스] UNIX 서버의 현재시간 읽어오기  김영대 2003/03/11 7334 1918
48   [Delphi] [소스] ORACLE 리스너의 alive 검사  김영대 2003/03/11 6360 1674
47   [Delphi] [소스] 테트리스(Tetris) 게임  김영대 2003/03/11 7237 1693
46   [Delphi] [소스] 쓰레드를 사용한 Query 동시 날리기  김영대 2003/03/12 8476 1756
45   [Delphi] [소스] 하루에 한번씩 자동으로 배경화면 바꾸기  김영대 2003/03/12 7343 1699
44   [Delphi] [소스] 레포트 컴포넌트없이 서식출력/저장  김영대 2003/03/12 6434 1647
43   [Delphi] [소스] Query한 결과를 텍스트 파일로 저장하기(Excel 포함)  김영대 2003/03/12 8710 1656
42   [Delphi] [소스] DBGrid 에 검색화면 만들어주는 콤포넌트  김영대 2003/03/12 6902 1640
41   [Delphi] [소스] DBGrid의 자료를 Popup 해주는 콤포넌트  김영대 2003/03/12 6554 1524
40   [Delphi] [소스] 도구모음 프로그램 만들기  김영대 2003/03/12 6765 1580
39   [Delphi] [소스] 파일의 내용 전체를 비밀번호로 암호/복호화  김영대 2003/03/12 7687 1573
38   [Delphi] [소스] Text(*.csv, *.txt) 파일을 DB 로 올리기  김영대 2003/03/12 8936 1591
37   [Delphi] [소스] RichEdit를 이용한 워드패드(WordPad)  김영대 2003/03/12 6623 1587
36   [Delphi] [소스] 인쇄 미리보기 화면 만들기 - 워드패드2  김영대 2003/03/12 7632 1733

1 [2][3]
 

Copyright 1999-2019 Zeroboard / skin by zero