콜백 함수와 후킹 기법
|
|
- 지승 서
- 6 years ago
- Views:
Transcription
1 콜백함수와후킹기법 (Callback functions and Hooking Techniques) Win32 API 를이용하여어플리케이션을개발하다보면, 콜백함수에대한내용을많이보게된다. 그렇다면이렇게흔히보게되는콜백함수란과연무엇일까? 그리고, 이런콜백함수를이용해서할수있는것중에서후킹기법을이용하면윈도우운영체제에서사용할수있는여러가지마우스작업이나키보드작업등을중간에서조작하여활용하는것이가능하다. 이번장에서는콜백함수와후킹기법에대해알아보도록한다. 콜백함수 (Callback functions) 콜백함수는대단히유용함에도별로사용되지않는것중의하나이다. 이를활용하면중복된코드의양을줄일수있으며, 읽기가쉬우면서도직관적인모듈을디자인할수있다. 콜백이란프로시저나함수를다른프로시저나함수의파라미터로넘겨서그함수에특정이벤트가발생할때호출될수있도록하는함수를말한다. 콜백함수의실행이완료되면제어권은원래의프로시저 ( 함수 ) 로넘어온다. 예를들어, 객체의배열이있고이객체들의특정메소드를공통으로실행시키고싶다고하자. 이경우에는배열을루프를돌리면서특정메소드를호출하는방법을사용할수있다. 그러면, 동시가아닌여러시점에서여러개의다른메소드를실행시키고싶다고하자. 이때에는루프와같은단순한방법으로는해결할수가없다. 이럴때콜백함수를활용하면유용한해결책을구할수있다. 즉, 객체들에적용해야하는마스터프로시저를작성하고이들각각이각객체를파라미터로넘겨주면서콜백프로시저를호출하면된다. 또한, 콜백함수를달리말하면어플리케이션에서구현된함수의주소를 DLL 에포함되어있는함수에보낼수있는것을말한다. DLL 의함수는어플리케이션의함수에게다시정보를담아서보낸다. 콜백함수와 Win32 API 콜백함수를설명할때빠지지않고단골로설명하는윈도우 API 함수에는 EnumFonts() 함수가있다. EnumFonts() 함수는주어진장치컨텍스트에서사용이가능한폰트를나열하는함수이다. 각각의나열되는폰트는 EnumFonts() 함수가어플리케이션의함수로콜백을하게된다. 즉, 각폰트에대한정보를돌려주는것이다. 이런과정이나열할폰트가모두나열되거나, 콜백함수가더이상의나열을중지하고자하는의미의 0 을반환할때까
2 지계속된다. 대부분의콜백함수를파라미터로사용할수있는윈도우 API 함수는 lpdata 파라미터역시사용할수있도록허용하고있다. 보통이런 lpdata 파라미터는어플리케이션이정의한데이터를나타내는역할을한다. lpdata 파라미터가 DLL 에전달될때에는보통 LongInt 형으로전달된다. 그러므로, LongInt 형의데이터가아닌보다복잡한형태의데이터를넘기고자할경우에는데이터구조체의포인터를 LongInt 로형변환 (typecast) 한뒤에 DLL 의함수를호출한다. 그리고, DLL 의함수에의해서처리된후에콜백함수로넘어오는 LongInt 형의데이터를다시포인터로형변환하면데이터구조체에접근할수있게된다. 앞에서도잠시언급했지만, 콜백함수가윈도우 API 함수에의해호출될때에는윈도우 API 함수에넘겨준 lpdata 파라미터가다시콜백함수가사용할수있도록넘어오게된다. 이렇게함으로써어플리케이션에서전역변수를선언하지않아도프로세스간의장벽을넘을수있게된다. 간단한예를들어보면모든가능한폰트를드롭-다운리스트박스에보여주는대화상자를가정해보자. 이렇게하려면, WM_INITDIALOG 메시지를처리할때 EnumFonts() 함수를호출해야하는데, 이때폰트의정보를처리할콜백함수의주소를담아서호출해야한다. 콜백함수는아마도넘어온각폰트의이름을리스트박스에추가하는역할을하게된다. 이때문제가하나있는데, 콜백함수가리스트박스에대한핸들을가지고있지않기때문에, 리스트박스에대한핸들을전역변수에담아서처리해야한다. 그런데, 이때 lpdata 파라미터를이용해서리스트박스의핸들을콜백함수에서받게되면이러한문제를해결할수있다. 물론전역변수를쓰는것도하나의해결책이되겠지만, 언제나전역변수가적은수로유지하는것이좋은습관이므로가능한 lpdata 파라미터를활용하는것이좋다. 전역변수를사용할때또하나의문제점은콜백함수를 16 비트 DLL 에구현할경우에는데이터를저장한전역변수가콜백을이용할때데이터가파괴될가능성이있다. 예를들어, 앞의폰트대화상자를여러개의어플리케이션에서사용한다고가정하자. 아마도이런경우에는각각의어플리케이션에서폰트대화상자를구현하기보다는, 폰트대화상자를 DLL 에구현하고이를사용하기를원할것이다. 그런데, 이때 DLL 에서리스트박스의핸들을저장하기위해전역변수를사용한다면, 하나이상의어플리케이션이동시에대화상자를로드할때문제가발생할수있다. 각각의폰트대화상자의복사본 (copy) 은각기다른리스트박스의핸들을담게되므로, 전역변수를사용해서는문제가발생하게된다. 이럴때에는리스트박스의핸들을 lpdata 파라미터를이용해서 EnumFonts() 함수에넘겨주면된다. 이런문제는 Win32 에서는 DLL 이독립적인기억공간을확보하기때문에문제가되지않는다. 콜백함수를이용한 API 활용예제 콜백함수를이용해서현재시스템에서돌아가는메인윈도우의캡션을보여주는예제를가
3 지고콜백함수의기본적인사용방법을익혀보도록하자. 먼저사용할윈도우 API 함수인 EnumWindows API 함수의정의부분을살펴보자. function EnumWindows(lpEnumFunc: TFNWndEnumProc; lparam: LPARAM): BOOL; stdcall; 여기서 lpenumfunc 의파라미터는콜백함수의주소를넘기게되며, lparam 파라미터는어플리케이션에서정의한데이터를나타낸다. 이때콜백함수의프로시저형은윈도우도움말을바탕으로어플리케이션의 type 선언문에서선언해주어야한다. 그러므로, 다음과같은형태의프로시저형을어플리케이션의인터페이스섹션에선언한다. 여기서파라미터의데이터형만맞으면콜백함수로사용하는데에는전혀지장이없다. 사실이런프로시저형을직접 type 선언문에선언하지않아도사용할콜백함수의파라미터의데이터형과순서, 수만맞으면아무런상관없이사용할수있다. type EnumWIndowsProc = function(hwnd: THandle; Param: Pointer): Boolean; stdcall; 첫번째파라미터는각메인윈도우의핸들이고, 두번째파라미터는 EnumWindows 함수를호출할때넘겨주는값이다. 사실파스칼에서 TFNWndEnumProc 형은제대로정의된것이아니고, 단지포인터일뿐이다. 즉, 함수에적절한파라미터를넘겨주고나서는이를포인터로사용해서호출하는대신그함수의주소를이용한다는것을의미한다. 새로운어플리케이션을시작하고폼에리스트박스와버튼을하나씩얹어서폼을다음그림과같이디자인한다.
4 그러면콜백함수로사용할함수를다음과같이제작한다. function GetCaption(HWnd: THandle; Param: Pointer): Boolean; stdcall; var Text: String; SetLength(Text, 100); GetWindowText(HWnd, PChar(Text), 100); Form1.ListBox1.Items.Add(IntToStr(HWnd) + ':' + Text); Result := True; 이런콜백함수는파라미터만맞으면사용이가능하다. 이콜백함수의역할은윈도우의캡션을문자열로읽어서리스트박스에추가한다. 그러면, 이콜백함수를이용하기위한 Button1 의 OnClick 이벤트핸들러를다음과같이작성하도록한다. procedure TForm1.Button1Click(Sender: TObject); var EnumWin: EnumWindowsProc; ListBox1.Items.Clear; EnumWin := GetCaption; EnumWindows(@EnumWin, 0); 앞의코드는단지이렇게사용할수도있다는것을보여주기위한것으로, 변수로선언한 EnumWin 의선언과이변수에 GetCaption 함수의주소를저장해서 EnumWindows API 함 수를호출하는과정을다음과같이간단히처리하는것과내용은같은것이다. procedure TForm1.Button1Click(Sender: TObject); ListBox1.Items.Clear; EnumWindows(@GetCaption, 0);
5 이제이프로그램을실행하고버튼을클릭하면다음과같은실행화면을볼수있을것이다. 콜백함수의실용적활용 콜백함수를이용하는방법을익히는좋은예제로디렉토리를뒤지면서파일을검색하고, 파일이발견될때마다콜백함수를호출하여이를표시하는등의것을예로들수있겠다. 콜백함수를사용하기위해서는먼저프로시저형을유닛의 type 섹션에다음과같이선언해야한다. TFileSearchCallback = procedure(filename: string) of Object; 이와같이콜백함수를사용하기위해서는객체의메소드로서의프로시저형을선언해서사 용한다. 여기서파라미터형이맞을경우얼마든지콜백으로사용이가능하다. 그리고나서는실제로콜백함수를호출할프로시저를다음과같이선언한다. procedure SearchDirectory(Dir, Condition: string; cb: TFileSearchCallback); 이프로시저의형태를살펴보면검색을할디렉토리와검색할문자열을나타내는파라미터인 Dir, Condition 은다른프로시저의형태와별로다를것이없지만, cb 파라미터에서앞에서선언한 TFileSearchCallback 프로시저형을사용하는것이중요한부분이다. 이파라미터의의미는여기에콜백함수를대입하여콜백을이용할수있게된다는것이다.
6 이제실제로디렉토리를검색하는예제어플리케이션을작성해보도록하자. 새로운어플리케이션을시작하자. 앞에서설명한대로콜백프로시저형을 type 섹션에선언하고, SearchDirectory 프로시저를 private 섹션에선언한다. 그리고, 다음과같이구현한다. procedure TForm1.SearchDirectory(Dir, Condition: string; cb: TFileSearchCallback); var SearchRec: TSearchRec; Value: LongInt; Value := FindFirst(Dir + '\' + Condition, faanyfile, SearchRec); while Value = 0 do cb(dir + '\'+ SearchRec.Name); Value := FindNext(SearchRec); 기본적으로이프로시저는 Dir 파라미터로넘어온디렉토리를검색해서파일을찾게되면콜백함수를호출하는데, 콜백함수에게현재파일의경로를포함한파일이름을파라미터로넘겨주게된다. 그러면이제실제로콜백을수행할콜백함수를작성하고예제를눈에보일수있도록만들어보자. 폼에 TButton, TListBox, TEdit, TDriveComboBox, TDirectoryListBox 컴포넌트를하나씩올려놓도록하자. 그리고 Button1 의 Caption 프로퍼티를 시작 으로, Edit1 의 Text 프로퍼티를 로다음과같이설정한다. 여기서 TEdit 컴포넌트에검색할문자열을입력하고버튼을클릭하면해당되는파일을찾아서파일의이름일 TListBox 컴포넌트에추가하도록하는것이다. 그리고, TDriveComboBox 와 TDirectoryListBox 를연결하기위해 DriveComboBox1 의 DirList 프로퍼티를 DirectoryListBox1 으로설정한다.
7 그리고나서, 다음과같이콜백프로시저를 private 섹션에선언한다. procedure FileSearchCallback(FileName: string); 이콜백함수는디렉토리에서파일을찾게되면, 파일이름을 TListBox 컴포넌트에추가하 여보여주는간단한함수로다음과같이작성하도록한다. procedure TForm1.FileSearchCallback(FileName: string); Listbox1.Items.Add(ExtractFileName(FileName)) 이제 Button1 의 OnClick 이벤트핸들러를다음과같이작성한다. procedure TForm1.Button1Click(Sender: TObject); ListBox1.Items.Clear; SearchDirectory(DirectoryListBox1.Directory, Edit1.Text, FileSearchCallback); 으로넘겨주지않고직접 FileSearchCallback 으로넘겨주는것에주목한다. 이것은델파이가사용하는오브젝트파스칼의특성에기인한것으로, C/C++ 의경우에는기본적으로객체의주소를포인터로선언하고, 이를이용해서프로그래밍을해야하므로명시적으로함
8 수의주소를가리키는연산자를사용해야하지만, 를사용하지않아도잘작동한다. 이제이어플리케이션을컴파일해서실행하고, 적당한디렉토리와검색문자열을입력한후버튼을클릭하면다음과같은실행화면을얻을수있을것이다. 후크함수 (Hook functions) 후크함수는윈도우메시지시스템에삽입되어메시지에대한처리가일어나기전에메시지스트림에접근해서이를처리할수있는콜백함수이다. 흔히, 메시징시스템에다른후크가있는경우가있는데, 이때에는후크연쇄 (Hook chain) 에서의다음의후크를호출해서이들이모두동작할수있도록해야한다. 후크를이용해서시스템에서메시지트래픽을모니터하는서브루틴을제작한다든가, 목적윈도우프로시저에도달하기전에일부메시지를처리하는등의일을할수있다. 후크는각각의메시지를처리할때거쳐야하는과정을증가시키기때문에시스템의속도를다소저하시키는경향이있다. 그러므로, 후크는꼭필요할때설치했다가가능한빨리제거해주어야한다. 후크함수를설치할때에는 SetWindowsHookEx() API 함수를이용한다. 이함수를호출하면설치된후크함수에대한 32 비트핸들을얻게되며, 이핸들을이용해서후크를제거하거나다음의후크를호출할때이용한다. 후크를제거할때에는 UnHookWindowsHookEx() API 함수를, 다음후크를호출할때에는 CallNextHookEx() 함수를호출한다. 이때시스템전반에걸친호크는후크함수가 DLL 에위치해야하지만, 어플리케이션에지정된후크함수는어플리케이션이나 DLL 에모두위치할수있다.
9 후크연쇄 (Hook Chains) 윈도우는다른종류의많은후크의종류를가지고있다. 각각의후크의형은윈도우메시지처리메커니즘의다른면에접근한다. 예를들어, 마우스메시지에대한메시지트래픽을모니터할때에는 WM_MOUSE 후크를이용한다. 윈도우는각각의후크종류에따라분리된후크연쇄 (hook chain) 를가지고있다. 후크연쇄는후크프로시저로불리는어플리케이션이정의한콜백함수에대한포인터의리스트이다. 특정한종류의후크와연관된메시지가발생하면윈도우는메시지를후크연쇄에서참조하는각각의후크프로시저에넘기게된다. 후크프로시저의동작은연관된후크의종류에따라달라진다. 일부의후크프로시저는메시지를모니터할뿐이지만, 일부의경우에는메시지를변경하거나전달을중지시킬수있다. 후크프로시저설치와해제할때주의점 후크프로시저를설치할때에는 SetWindowsHookEx 함수를이용한다. 그리고, 이함수를호출할때에는호출하는후크의종류와프로시저가모든쓰레드와연관되어야하는지, 아니면특정쓰레드와연관되는지여부그리고프로시저엔트리포인터등을지정하게된다. 후크프로시저를설치하는어플리케이션은반드시전역후크프로시저를 DLL 에분리해야한다. 대신후크프로시저를설치하기전에 DLL 모듈의핸들을가지고있어야한다. 즉, LoadLibrary 함수를이용해서 DLL 모듈의핸들을얻은후, 이렇게핸들을얻으면 GetProcAddress 함수를이용해서후크프로시저의주소를얻을수있게된다. 마지막으로 SetWindowsHookEx 함수를이용해서후크프로시저의주소를적절한후크연쇄에설치한다. SetWindowsHookEx 함수에는모듈의핸들과후크프로시저의엔트리포인트, 그리고쓰레드에대한 identifier 을넘겨주는데, 보통은이값으로 0 을넘겨서시스템의모든쓰레드에반응할수있도록한다. 특정쓰레드에대한후크프로시저를해제 ( 후크연쇄에서프로시저의주소를삭제하는것 ) 할때에는 UnhookWindowsHookEx 함수에후크프로시저의핸들을지정해서호출하게된다. 전역후크프로시저를해제할때에도 UnhookWindowsHookEx 함수를호출하기는마찬가지이다. 그런데, 이함수는후크프로시저를담고있는 DLL 을해제하지않는다. 이는전역후크프로시저는모든윈도우기반의어플리케이션에서호출되기때문에, 이들이암시적으로 LoadLibrary 함수를호출하기때문으로, 이들이모두 FreeLibrary 를호출하게할수있는방법이없다. 그러므로, 결국에는모든어플리케이션을중지시키거나또는이들이모두 FreeLibrary 를호출하게해야한다. 이를해결하기위해서전역후크프로시저를설치할때에는설치함수를 DLL 에후크프로시저와함께제공한다. 이렇게하면설치어플리케이션이 DLL 모듈의핸들을가지고있을필요가없다. 각어플리케이션은반드시 DLL 과연결해야만후크를설치할수있게되고,
10 설치함수는 SetWindowsHookEx 함수의호출을통해 DLL 의모듈핸들을제공한다. 플리케이션은종료될때이 DLL 의핸들을통해서후크를해제하게된다. 어 윈도우후크의종류 윈도우의후크에는다음과같은종류들이있다. WH_CALLWNDPROC: SendMessage() 함수가호출될때마다호출되는윈도우프로시저후크 WH_CBT: CBT(computer based training) 후크는윈도우를생성, 파괴, 최대화, 이동, 크기변화등의이벤트가있거나, 마우스나키보드이벤트를제거하기전에또는입력포커스의변경이나시스템메시지큐의동기화기있기전에호출되는후크이다. WH_GETMESSAGE: GetMessage() 함수가어플리케이션큐에서메시지를가져올때마다호출되는후크이다. WH_HARDWARE: 어플리케이션이 GetMessage(), PeekMessage() 함수를호출하고, 처리할하드웨어이벤트 ( 마우스와키보드이벤트를제외한 ) 가있을때호출되는후크이다. WH_JOURNALRECORD: 시스템메시지큐에서메시지를삭제할때호출되는후크이다. WH_JOURNALPLAYBACK: 마우스나키보드메시지를시스템메시지큐에삽입할때이용되는후크이다. WH_KEYBOARD: 어플리케이션이 GetMessage(), PeekMessage() 함수를호출하고, WM_KEYUP 또는 WM_KEYDOWN 키보드메시지를처리해야할때호출되는후크이다. WH_MOUSE: 어플리케이션이 GetMessage(), PeekMessage() 함수를호출하고, 마우스메시지를처리해 야할때호출되는후크이다.
11 WH_MSGFILTER: 대화상자나메시지상자또는메뉴가메시지를불러올때, 메시지가처리되기전에호출되 는후크이다. WH_SHELL: 시스템이만들어놓은 notification 메시지가있을때호출되는후크이다. WH_SYSMSGFILTER: 대화상자나메시지상자또는메뉴가메시지를불러올때, 메시지가처리되기전에호출되 는시스템전체에대한후크이다. 기본적인후크예제 후크를어떻게설치하고해제하는지를코드를통해서알아보자. 시스템후크로사용할함수를 DLL 파일에담고, 이 DLL 을사용하여시스템후크를설치, 제거하는어플리케이션을하나제작한다. DLL 파일은 ExamLib3.DLL, 어플리케이션은 Exam3.EXE 로한다. 먼저, DLL 파일을만들기위해새로운 DLL 프로젝트를하나시작한다. 그리고다음의코드를입력하자. library ExamLib3; Uses SysUtils, Windows, Dialogs; function KeyboardProc(Code, WParam, LParam: Integer): LRESULT; stdcall; var Val: Integer; Val := -1; if (Code >= 0) then Val := CallNextHookEx(0, Code, WParam, LParam); Result := Val; exports KeyboardProc index 1;
12 end. 이 DLL 파일은실제로아무동작을하지않고, 다음의후크를호출하는역할만을한다. 그러면, DLL 파일을이용해서후크를설치, 해제하는어플리케이션을제작하자. 폼을생성할때후크를설치하고, 폼을파괴할때후크를해제하도록한다. 후크의핸들을 public 멤버인 HandleHook 에저장하고, DLL 의핸들을 private 멤버인 hinst 에저장하도록하자. 어플리케이션의소스는다음과같다. unit U_Exam3; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(tform) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private hdll: HInst; public HandleHook: HHook; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject);
13 hdll := LoadLibrary('ExamLib3'); if hdll = 0 then ShowMessage('DLL 을로드하지못했습니다.'); HandleHook := SetWindowsHookEx(WH_KEYBOARD, GetProcAddress(hDLL,PChar('KeyboardProc')), hdll, 0); if HandleHook = 0 then ShowMessage(' 후크를설치하지못했습니다.'); procedure TForm1.FormDestroy(Sender: TObject); if not UnhookWindowsHookEx(HandleHook) then ShowMessage(' 후크를해제하지못했습니다.'); end. 즉, 후크를설치할때우선 DLL 파일을 LoadLibrary 함수를이용해서메모리에적재한후 DLL 파일에저장되어있는함수의주소를후크프로시저로설정한다. 이때윈도우 API 함수인 SetWindowsHookEx 를사용하는데, 후크를설치하지못하면 0 이반환된다. 후크를제거할때에는설치된후크의핸들을이용해서 UnhookWindowsHookEx 함수를호출하면된다. 이함수의경우에는후크를제거하지못하면 False 를반환한다. 후크를이용한매크로작성기제작 이번에는실제사용가능하도록후크를응용해보자. 아래아한글이나워드, 그밖의많은에디터에보면대부분의경우키보드와마우스동작을기록했다가저장하고, 이를다시재생할수있는매크로기능을제공한다. 그러면, 윈도우의후크프로시저를이용해서키보드와마우스입력을기록했다가이를다시재생할수있는 DLL 과이를이용한간단한예제어플리케이션을제작해보자. 이예제는볼랜드에서제공하는기술백서 (Technical white paper) 에공개되었던어플리케이션에기초한것임을미리밝혀둔다. 이렇게메시지를기록하고, 재생하기위해서는시스템전체에적용되는 (system wide) WH_JOURNALRECORD, WH_JOURNALPALYBACK 윈도우후크를이용한후크함수를사용하게된다. 이때각각의윈도우후크에대한후크프로시저를 JournalRecord() 와
14 JournalPlayback() 이라고하자. JournalRecord 와 JournalPlayback 후크의콜백함수를설치하기위해윈도우 API 함수인 SetWindowsHookEx() 에후크콜백함수의주소를넘겨주어야한다. 이때 JournalRecord 와 JournalPlayback 콜백함수는시스템후크 (system wide hook) 이므므로, 반드시 DLL 에위치해야하며후크콜백함수의주소는인스턴스화한주소를넘겨주지않아도된다. 이함수를호출하면후크콜백함수에대한 32 비트핸들을반환하게되는데, 이핸들을이용해서다른후크함수가이미후크연쇄 (hook chain) 에존재하는지확인하고, 기록이끝나면후크를연쇄에서제거하는등의일을할수있다. 일단 JournalRecord 콜백함수의주소를가지고 SetWindowsHookEx() 를호출하면, 윈도우는즉시메시지의기록을시작한다. 이때 JournalRecord 콜백함수가호출되는조건은다음과같다. 1. 기록할키보드나마우스이벤트가존재할때 (HC_ACTION) 2. 시스템이모달상태에들어가거나 (HC_SYSMODALON), 모달상태에서빠져나올경우 (HC_SYSMODALOFF). 3. 시스템이후크연쇄에서다음후크를호출하기원할때 키보드나마우스이벤트가있을경우에는 HC_ACTION 후크와같은경우인데, 이이벤트를기록할수있다. 이때 EVENTMSG 형의구조체에대한포인터가 JournalRecord 콜백함수의 lparam 파라미터에담겨서넘어오게된다. 이벤트가발생한시스템시간은 EVENTMSG 구조체의 time 파라미터에담겨있다. 재생을하기위해서는 EVENTMSG 구조체를복사하고, 그복사본의 time 을적절하게조절하면된다. 즉, 메시지를기록할때시스템시간을얻은후각메시지의시간에서처음에얻은시스템시간을빼면, 기록이시작된후얼마의간격으로메시지들이발생했는지알아낼수있다. 이값들을재생이시작되는시간에더하면기록할때와같은간격으로메시지들을발생시킬수있다. 시스템이모달상태에들어갔을경우에는 HC_SYSMODALON 후크와같은경우로이때에는잠시기록을멈추고, 후크연쇄의다음메시지후크를호출하게하여야하며, 모달상태에서빠져나올경우의후크인 HC_SYSMODALOFF 의경우에다시기록을재개하도록하면된다. 만약코드값이 0 보다작을경우에는시스템이후크연쇄의다음메시지후크를호출할것을요구하게되며, 이때에는이를따라야한다. 그리고, 기록이끝났을경우에는윈도우 API 함수인 UnHookWindowsHookEx() 을 SetWindowsHookEx() 함수를호출했을때얻은 32 비트핸들을파라미터로해서호출하면후크콜백함수를후크연쇄에서제거하게된다. 기록된메시지를재생하고자할때에는또다시 SetWindowsHookEx() API 함수를 JournalPlayback 콜백함수의주소를파라미터로해서호출하면윈도우는즉시재생을시작하게된다. 재생을하는동안에는정상적인마우스와키보드입력이시스템에의해중지
15 된다. JournalPlayback 콜백함수는다음의조건에부합될때각각다음과같은역할을하여야 한다. 1. HC_SKIP: 다음메시지를불러온다. 수를호출해서, 후크를제거한다. 재생할메시지가더이상없으면 UnHookWindowsHookEx() 함 2. HC_GETNEXT: 현재의메시지를재생한다. 3. HC_SYSMODALON: 시스템이모달상태에들어간경우로, 메시지재생중에모달상태로들어간다는것은시스템에어떤문제가생겼음을의미한다. 그러므로, 후크연쇄의다음후크를호출하여이를처리할수있도록해준다. 4. HC_SYSMODALOFF: 시스템이모달상태에서빠져나온경우로, 윈도우는 JournalPlayback 콜백프로시저를제 거하고, 후크연쇄의다음후크를호출한다. 5. 코드가 0 보다작은경우 : 시스템이더이상의처리를원하지않고, 다음후크를호출하라고요구하는것이다. 이런시스템후크를구현하기위해서는 SetWindowsHookEx() 함수를호출하기전에, 첫번째메시지를받아서시스템시간을얻어야만각각의기록된메시지들이재생시에동기화되어동작하게할수있다. 이때윈도우는같은메시지를한번이상반복할것인지묻는다. 윈도우가현재메시지를재생할것인지를처음물어올때 JournalPlayback 콜백함수는현재시간과메시지가작동하도록되어있는시간의차이부분을반환한다. 만약이값이음수라면 0 을반환하도록해야한다. 또한, 같은메시지가한번이상요구될경우에도 0 을반환한다.
16 후크 DLL 의동작방식 실제핵심적인역할을담당하는 DLL 파일에는다음과같은세가지함수와윈도우가사용 하게될두가지후크함수가포함되어있다. 1. StartRecording() 2. StopRecording() 3. Playback() 4. JournalRecordProc() 5. JournalPlaybackProc() StartRecord() 함수는 JournalRecordProc() 후크를설치하고이벤트를기록하기시작하는역할을한다. StartRecord() 를호출하다가에러가발생하거나, 이미매크로를기록하거나재생하고있을때에는더이상의처리를하지않고, 0 을반환한다. 매크로의기록이이루어지는중간에는키보드와마우스이벤트를배열에저장한다. 참고로지나치게많은수의메모리소모를줄이기위해서최대치를설정한다. StopRecording() 가호출되면, 기록한이벤트들을디스크에저장한다. 그리고나서, JournalRecordProc() 후크를제거한다. 이때아무것도기록된것이없을경우에는 1 을후크를제거할때에러가발생하면 2 를에러코드로반환한다. 에러가없을때에는기록된메시지의수를반환한다. Playback() 함수는기록된매크로를재생할때호출한다. 에러가발생하거나, 재생할것이없으면더이상의처리를하지않고 0 을반환한다. 재생이끝나면, 매크로를재생하도록호출한어플리케이션을콜백한다. 그러므로, 이함수를호출하는어플리케이션은콜백함수를작성하여재생이끝났을때의처리를해줄수있다. 데이터의공유를위해서몇개의전역변수를선언했다. 물론이러한데이터공유를위해서는메모리맵파일등의보다세련된방법을선택할수도있겠으나, 여기에대해서는다음에다루도록한다. 일단 EventMsg 구조체배열에대한포인터인 PMsgBuff 라는전역포인터를정의하고, 이를이용해서메모리에이벤트를기록하고재생한다. 일단 DLL 이시작되면이포인터를 nil 로초기화하고, 매크로를기록하거나재생할때에만이포인터가실제로메모리블록을가리키도록한다. 다른경우에는언제나 nil 값을가지도록설정함으로써현재매크로가기록되거나, 재생되는지여부를확인할수있다. 그밖에사용하는전역변수에는다음과같은내용들을담게된다. 1. TheHook: 후크프로시저의 32 비트핸들 2. StartTime: 매크로의기록이나재생이시작되는시간 3. MsgCount: 기록된메시지의총수
17 4. CurrentMsg: 현재재생되고있는메시지 5. ReportDelayTime: 지체된시간을리포트해야하는지여부 6. SysModalOn: 시스템에현재모달상태에있는지여부 7. cbplaybackfinishedproc: 어플리케이션콜백함수의인스턴스주소 8. cbappdata: Playback() 함수에게넘겨주는어플리케이션데이터의파라미터 후크 DLL 의구현 그러면, 실제로 DLL 을제작해보자. 먼저 DLL 의프로젝트의이름을 Hook2Lib.dpr 로저장한다. 그리고, 사용할데이터형과전역변수를다음과같이선언한다. library Exam4Lib; uses Windows; type TwMsg = LongInt; TwParam = LongInt; TlParam = LongInt; const MAXMSG = 6500; type PEventMsg = ^TEventMsg; TMsgBuff = Array[0..MAXMSG] of TEventMsg; TcbPlaybackFinishedProc = procedure(appdata: Longint); stdcall; var PMsgBuff: ^TMsgBuff; TheHook: HHook; StartTime: Longint; MsgCount: Longint; CurrentMsg: Longint;
18 ReportDelayTime: Bool; SysModalOn: Bool; cbplaybackfinishedproc: TcbPlaybackFinishedProc; cbappdata: Longint; 상수로선언한 MAXMSG 는메시지를기록할때과도한메모리사용을막기위해서한도를정한것으로조절이가능하다. TcbPlaybackFinishedPrc 프로시저형은 DLL 의 Playback() 함수를호출하는어플리케이션에대한콜백을지원한다. 어플리케이션은이프로시저형에맞는콜백함수를작성하고, DLL 의 Playback() 함수에콜백함수의주소를넘겨주면 Playback() 함수의종료와함께이콜백함수를호출하게된다. 나머지전역변수에대해서는앞에서도간략히언급했으므로자세한설명은생략하겠다. 먼저매크로를기록할후크프로시저인 JournalRecordProc 함수의구현부분을살펴보자. function JournalRecordProc(Code: Integer; wparam: TwParam; lparam: TlParam): Longint; stdcall; Result := 0; case Code of HC_ACTION: if SysModalOn then if MsgCount > MAXMSG then PMsgBuff^[MsgCount] := PEventMsg(lParam)^; Dec(PMsgBuff^[MsgCount].Time, StartTime); Inc(MsgCount); HC_SYSMODALON: SysModalOn := True; CallNextHookEx(TheHook, Code, wparam, lparam); HC_SYSMODALOFF:
19 SysModalOn := False; CallNextHookEx(TheHook, Code, wparam, lparam); if Code < 0 then Result := CallNextHookEx(TheHook, Code, wparam, lparam); 일단이함수의리턴값을 0 으로설정하고, Code 파라미터의값에따른처리를해준다. 이코드의값이 HC_ACTION 인경우에는기록할키보드나마우스이벤트가있는것이므로 lparam 의메시지를버퍼에저장한다. 이때주의할것은메시지의시간을기록하는것인데, 최초에 StartRecord() 함수가호출되면 StartTime 전역변수에기록시작시각이기록되므로, 이벤트가발생한시각에서 StartTime 변수의값을빼면기록시작시각에서부터얼마뒤에일어난이벤트인지알수있다. 시스템이모달상태에들어가거나빠져나오는경우에는 SysModalOn 전역변수의값을설정하고, CallNextHookEx 함수를호출하여다음후크를실행한다. 또한, 처리할후크코드가아닌경우에도다음후크를실행한다. 그러면, 이러한매크로기록후크함수를설치하고기록을시작하게하는 StartRecording 함수를구현하도록하자. 이함수의구현부분은다음과같다. function StartRecording: Integer; stdcall; Result := 0; if pmsgbuff <> nil then GetMem(PMsgBuff, Sizeof(TMsgBuff)); if PMsgBuff = nil then SysModalOn := False; MsgCount := 0; StartTime := GetTickCount; TheHook := SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, hinstance, 0); if TheHook <> 0 then Result := 1;
20 end else FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; 먼저기본적인결과값을 0 으로설정하고, 메시지버퍼를검사해서버퍼에메모리가할당되어있으면이는메시지가기록되어있거나, 현재기록중임을의미하므로실행을중지한다. 이상이없으면버퍼에대한메모리를할당하고, 초기전역변수값을설정한다. 특히 StartTime 전역변수의값을설정할때에는 GetTickCount API 함수를이용한다. 그리고, WH_JOURNALRECORD 후크에대한후크함수를설치한다. 이때설치가성공적이면 0 이아닌값이리턴되므로결과값으로 1 을반환하고, 0 이리턴되면버퍼에대한메모리를해제한다. 매크로의기록을중지하는 StopRecording() 함수는구현이다소복잡하다. 단순히후크를해제하는것만이아니라버퍼에기록된메시지를디스크에저장하는역할을해주어야한다. 그렇기때문에파라미터로기록할파일이름을 PChar 형으로넘겨받는다. 실행결과에따라서반환되는결과값이다양한데, 성공적으로메시지가기록되고디스크에저장된경우에는저장된메시지의수를, 저장할메시지가없을때에는 1, 후크함수를제거하는데실패한경우에는 2 를반환하며 I/O 에러가발생한경우에는 0 을반환한다. 구현부분은다음과같다. function StopRecording(lpFileName: PChar): LongInt; stdcall; var TheFile: File; if PMsgBuff = nil then Result := -1; if UnHookWindowsHookEx(TheHook) = False then Result := -2;
21 TheHook := 0; if MsgCount > 0 then Assign(TheFile, lpfilename); {$I-} Rewrite(TheFile, Sizeof(TEventMsg)); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; Result := 0; {$I-} Blockwrite(TheFile, PMsgBuff^, MsgCount); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; Result := 0; {$I-} Close(TheFile); {$I+} if IOResult <> 0 then {$I-} Close(TheFile); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff));
22 PMsgBuff := nil; Result := 0; FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; Result := MsgCount; 소스가다소길지만내용은어렵지않다. 그리고, 중복되는부분이있으므로이를단축하면좋을것이다. 특별히설명할만한부분은없지만 $I 컴파일러지시자 (compiler directive) 를통해서 I/O 에러를처리하는부분에대해서잠시알아보자. 디폴트로표준 I/O 프로시저와함수를호출하면자동으로에러를검사하게되어있다. 만약에러가발생하면예외를발생시키거나예외처리가안될경우프로그램은실행을중단한다. 이런자동검사를여부를결정하는컴파일러지시자가 $I 이다. {$I-} 에의해 I/O 에러자동검사가꺼지게되는데, 이때에는 I/O 에러가발생해도예외가발생하지않는다. 그러므로, I/O 작업을한뒤에는 IOResult 함수를호출해서에러여부를알아보아야한다. 에러가발생하지않은경우에는 0 을반환한다. 앞의 StopRecording() 함수역시이런방법을이용해서 I/O 에러를처리한다. 이렇게해서매크로를기록하는부분에대한구현이모두끝났다. 이번에는매크로를재생하는부분을구현하도록하자. 먼저후크함수로사용될 JournalPlayback() 함수를다음과같이구현한다. 기본적인처리방침은 Code 값에따라서, HC_SKIP 인경우에는다음메시지를처리하되, 더이상의메시지가없으면후크함수를제거한다. HC_GENNEXT 는현재메시지를처리한다. 그밖의자세한내용은앞에서설명했으므로생략하도록하겠다. 눈여겨보아야할부분은 code 값이 HC_SKIP 인경우후크를제거할때와 HC_SYSMODALOFF 인경우메시지재생을마치는경우로이때에는어플리케이션에서넘겨준콜백함수를 cbplaybackfinishedproc(cbappdata) 와같은형태로호출한다. 이콜백함수는재생이끝났음을어플리케이션에알리면동작하게되는함수이다. function JournalPlaybackProc(Code: Integer; wparam: TwParam; lparam: TlParam): Longint; stdcall; var TimeToFire: Longint;
23 Result := 0; case Code of HC_SKIP: Inc(CurrentMsg); ReportDelayTime := True; if CurrentMsg >= (MsgCount-1) then if TheHook <> 0 then if UnHookWindowsHookEx(TheHook) = True then TheHook := 0; FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; cbplaybackfinishedproc(cbappdata); HC_GETNEXT: PEventMsg(lParam)^ := PMsgBuff^[CurrentMsg]; PEventMsg(lParam)^.Time := StartTime + PMsgBuff^[CurrentMsg].Time; if ReportDelayTime then ReportDelayTime := False; TimeToFire := PEventMsg(lParam)^.Time - GetTickCount; if TimeToFire > 0 then Result := TimeToFire; HC_SYSMODALON: SysModalOn := True; CallNextHookEx(TheHook, Code, wparam, lparam); HC_SYSMODALOFF:
24 SysModalOn := False; TheHook := 0; FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; cbplaybackfinishedproc(cbappdata); CallNextHookEx(TheHook, Code, wparam, lparam); if Code < 0 then Result := CallNextHookEx(TheHook, Code, wparam, lparam); 마지막으로 Playback() 함수를구현하도록하자. 이함수는재생할매크로파일의이름을 PChar 데이터형인파라미터로넘겨받고, 이와함께재생이끝난후호출할어플리케이션의콜백함수와어플리케이션데이터를파라미터로넘겨받아사용한다. 구현부분은다음과같다. function Playback(lpFileName: PChar; EndPlayProc: TcbPlaybackFinishedProc; AppData: Longint): Integer; stdcall; var TheFile: File; Result := 0; if PMsgBuff <> nil then GetMem(PMsgBuff, Sizeof(TMsgBuff)); if PMsgBuff = nil then Assign(TheFile, lpfilename); {$I-} Reset(TheFile, Sizeof(TEventMsg)); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff));
25 PMsgBuff := nil; {$I-} MsgCount := FileSize(TheFile); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; {$I-} Close(TheFile); {$I+} if IOResult <> 0 then if MsgCount = 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; {$I-} Close(TheFile); {$I+} if IOResult <> 0 then {$I-} Blockread(TheFile, PMsgBuff^, MsgCount); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; {$I-} Close(TheFile); {$I+}
26 if IOResult <> 0 then {$I-} Close(TheFile); {$I+} if IOResult <> 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; CurrentMsg := 0; ReportDelayTime := True; SysModalOn := False; cbplaybackfinishedproc := EndPlayProc; cbappdata := AppData; StartTime := GetTickCount; TheHook := SetWindowsHookEx(WH_JOURNALPLAYBACK, JournalPlayBackProc, hinstance, 0); if TheHook = 0 then FreeMem(PMsgBuff, Sizeof(TMsgBuff)); PMsgBuff := nil; Result := 1; 소스가다소길지만, 많은부분이중복되고 StopRecording() 함수와마찬가지로 I/O 에러처리를위해서길어진부분이많기때문이므로이해하기는쉬울것이다. 일단재생을하기위해메모리버퍼를설정하고, 디스크에있는메시지를버퍼에읽어들인후콜백함수와어플리케이션데이터를전역변수에저장한다. 그리고, 현재시각을 GetTickCount API 함수를통해서알아낸후 WH_JOURNALPLAYBACK 후크에대한후크함수를설치한다. 재생이성공적으로이루어진경우에는 1 을반환한다. 이로써 DLL 파일의구현이모두끝났다. 이를어플리케이션에서사용하려면함수를
27 export 해야한다. 이부분은다음과같이구현한다. exports JournalRecordProc index 1 name 'JOURNALRECORDPROC' resident, StartRecording index 2 name 'STARTRECORDING' resident, StopRecording index 3 name 'STOPRECORDING' resident, JournalPlayBackProc index 4 name 'JOURNALPLAYBACKPROC' resident, Playback index 5 name 'PLAYBACK' resident; 그리고, DLL 이처음시작되면메시지버퍼는메모리블록을가리키면안되므로다음과같 은코드를삽입한다. PMsgBuff := nil; end. 후크 DLL wrapper 의작성 앞의 DLL 프로젝트를컴파일한후, 맨처음예제와같은방식으로어플리케이션에서직접 DLL 을적재해서사용할수도있지만보다일반적이고, 쉽게사용하기위해서는 wrapper 유닛을작성해서사용하면편리하다. Wrapper 유닛이란 DLL 의함수를쉽게사용하기위해서파스칼문법에맞게만든인터페이스유닛으로, 이를이용하면인터페이스유닛의이름을사용하고자하는유닛의 uses 절에추가하는것으로해결할수있다. 참고로, 델파이의 Win32 API 지원도이러한 wrapper 유닛을통해서이루어지는것으로 windows.pas 등의유닛이대표적인 wrapper 유닛이다. 여기에대해서는 DLL 을다루는장에서더욱자세하게다루고있으므로이를참고하기바란다. 그러면, DLL 의 wrapper 유닛을다음과같이작성한다. unit HookExam; interface type TwMsg = LongInt; TwParam = LongInt; TlParam = LongInt;
28 TcbPlaybackFinishedProc = procedure(appdata: Longint); stdcall; function StartRecording: integer; stdcall; function StopRecording(lpFileName: PChar): LongInt; stdcall; function Playback(lpFileName: PChar; EndPlayProc: TcbPlaybackFinishedProc; AppData: Longint): Integer; stdcall; implementation function StartRecording; external 'ExamLib4' index 2; function StopRecording; external 'ExamLib4' index 3; function Playback; external 'ExamLib4' index 5; end. 예제어플리케이션의동작방식 후크 DLL 을사용하는어플리케이션에서는콜백함수로 PlaybackFinished() 를이용하도록하자. 이콜백함수는매크로의재생이완료되었을때호출된다. 즉, DLL 의 Playback() 함수에 PlaybackFinished() 콜백함수의주소를넘겨주어서 Playback() 이완료되는데로이를호출하게된다. 그런데, PlaybackFinished() 함수의주소를저장하기위해서프로그램시작시에전역변수를하나선언하고프로그램이종료될때이를해제하도록한다. 폼은매크로의기록을시작할때사용하는 기록시작 버튼, 기록을중지할때사용하는 기록중지 버튼, 매크로를재생할때사용하는 재생 버튼과어플리케이션을종료할때사용하는 완료 의네버튼으로구성한다. 폼이처음생성될때에는 기록시작 과 완료 버튼을사용가능하도록하고, 기록중지 와 재생 버튼은기록을중지시키거나, 재생할것이없으므로이를사용할수없도록설정한다. 각버튼의역할은다음과같다. 1. 기록시작 : 더이상의메시지를기록하거나기록중간에어플리케이션을종료하게하면안되므로, 기록시작 과 완료 버튼을사용불가능하게설정하고, 동시에 기록중지 버튼은사용이가능하도록설정한다. 그리고, DLL 의 StartRecording() 함수를호출해서메시지기록을시작한다. 이때 StartRecording() 함수가에러코드를반환하면사용자에게에러메시지를
29 보여주고, 기록시작 버튼이눌리기전의상태로재설정한다. 2. 기록중지 : 매크로를저장할파일이름을파라미터로 DLL 의 StopRecording() 함수를호출한다. 그리고 완료 와 기록시작 버튼을사용가능하도록설정해서, 세션을기록하거나어플리케이션에서빠져나갈수있도록허용한다. 또한, 기록이성공적으로이루어졌을경우에는 재생 버튼도사용할수있도록설정한다. 3. 재생 : 모든버튼을선택할수없도록설정하고, 재생할매크로가저장된파일이름과 PlaybackFinished() 콜백함수의인스턴스주소, 그리고어플리케이션이정의한데이터를받을파라미터로 DLL 의 Playback() 함수를호출한다. 매크로의재생이완료되면후크함수는어플리케이션의 PlaybackFinished() 콜백함수를호출해서재생이완료되었음을알림과동시에메인윈도우를어플리케이션데이터로넘겨준다. 이때 DLL 의 Playback() 함수가에러코드를반환하면, 재생 버튼이눌리기이전의상태로버튼들을재설정한다. PlaybackFininshed() 콜백함수가성공적으로호출되면 기록시작, 재생, 완료 버튼을사용가능하도록설정한다. 4. 완료 : 프로그램을완료한다. 그러면, 예제어플리케이션의폼을다음과같이디자인하자. 폼의각버튼의역할은앞에서간단히설명하였다. 먼저매크로를기록, 재생할파일이름을다음과같이상수로선언하고, 앞에서작성한후 크 DLL 을사용하기위해 uses 절에 HookExam 을추가한다.
30 const FILENAME = 'Hooking.MAC'; 그리고, 처음폼이생성될때의버튼들의초기값을다음과같이설정한다. procedure TForm1.FormCreate(Sender: TObject); Button1.Enabled := True; Button2.Enabled := False; Button3.Enabled := False; Button4.Enabled := True; 여기서 Button1 은 기록시작, Button2 는 기록중지, Button3 는 재생, Button4 는 완료 버튼이다. 각버튼의역할역시해당되는 DLL 함수를호출하고, 각버튼의 Enabled 프로퍼티를조절하는것으로각각의이벤트핸들러는다음과같다. procedure TForm1.Button1Click(Sender: TObject); Button2.Enabled := True; Button2.SetFocus; Button1.Enabled := False; Button3.Enabled := False; Button4.Enabled := False; if StartRecording = 0 then Button1.Enabled := True; Button1.SetFocus; Button2.Enabled := False; Button3.Enabled := False; Button4.Enabled := True; ShowMessage(' 기록을시작할수없습니다!');
31 procedure TForm1.Button2Click(Sender: TObject); if StopRecording(FILENAME) > 0 then Button1.Enabled := True; Button3.Enabled := True; Button3.SetFocus; end else Button1.Enabled := True; Button1.SetFocus; Button3.Enabled := False; Button2.Enabled := False; Button4.Enabled := True; procedure TForm1.Button3Click(Sender: TObject); Button1.Enabled := False; Button2.Enabled := False; Button3.Enabled := False; Button4.Enabled := False; if Handle) = 0 then Button1.Enabled := True; Button2.Enabled := False; Button3.Enabled := True; Button4.Enabled := True; Button3.SetFocus; procedure TForm1.Button4Click(Sender: TObject);
32 Close; 간단하므로이해에별무리가없을것으로믿는다. 그런데눈여겨보아야할부분은 Button3 의 OnClick 이벤트핸들러에서 Playback() 함수를호출하는부분으로, 재생이끝났을때이를처리할콜백함수의주소를파라미터로넘겨주게된다. 여기서는 PlaybackFinished 함수의주소를넘겨주었다. 그러므로, 이콜백함수를다음과같이작성한다. procedure PlaybackFinished(AppData: LongInt); stdcall; Form1.Button1.Enabled := True; Form1.Button2.Enabled := False; Form1.Button3.Enabled := True; Form1.Button4.Enabled := True; Form1.Button3.SetFocus; 이때 Form1 을앞에붙이는이유는이함수가 TForm1 클래스의메소드로선언되지않았기때문이다. 어쨌든후크 DLL 에의해 Playback() 함수가실행되면, 이함수가종료되는데로 PlaybackFinished() 프로시저가실행되어버튼들의활성화여부를결정하게된다. 이제이프로그램을실행시키면매크로기록, 재생을할수있게된다. 기록시작 버튼을누르고마음대로마우스와키보드를이용한작업을하고, 기록중지 버튼을누르면이메시지가매크로로기록이될것이며, 이를 재생 버튼을눌러서재현할수있다. 한번해보면얼마나유용하게쓰일수있을지알수있을것이다. 정리 (Summary) 이번장에서는 Win32 환경에서자주사용되는콜백함수에대한설명과콜백을이용하여구현할수있는후킹기법에대해서알아보았다. 콜백함수는후킹기법말고도다른곳에서도자주사용되므로, 확실하게이해해두는것이좋다.
PowerPoint Template
JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More information개요 1. 후킹이란? 후킹의정의.. 2 후킹의종류 2 앞으로 후킹프로그램을위한사전지식들 Window 에서 data 입력과정.. 3 DLL ( Dynamic Link Library ).. 4 메시지후킹을위해필요한지식들 5 3. 후킹프로그램제작에필요한 API
개요 1. 후킹이란? 후킹의정의.. 2 후킹의종류 2 앞으로...2 2. 후킹프로그램을위한사전지식들 Window 에서 data 입력과정.. 3 DLL ( Dynamic Link Library ).. 4 메시지후킹을위해필요한지식들 5 3. 후킹프로그램제작에필요한 API 함수소개 SetWindowsHookEx 함수 5 UnhookWindowsHookEx 함수 5
More informationVisual Basic 반복문
학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For
More informationMicrosoft PowerPoint - 09-CE-5-윈도우 핸들
순천향대학교컴퓨터학부이상정 1 학습내용 윈도우핸들 윈도우찿기 윈도우확인및제거 윈도우숨기기 윈도우포커스 윈도우텍스트 윈도우핸들 순천향대학교컴퓨터학부이상정 3 핸들 (handle) 윈도우에서구체적인어떤대상을구분하기위해지정되는고유의번호 32비트의정수값 핸들은운영체제가발급하고사용자가이값을사용 실제값이무엇인지는몰라도상관없음 윈도우, DC, 브러쉬등등 순천향대학교컴퓨터학부이상정
More information다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");
다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher
More information歯MDI.PDF
E08 MDI SDI(Single Document Interface) MDI(Multiple Document Interface) MDI (Client Window) (Child) MDI 1 MDI MDI MDI - File New Other Projects MDI Application - MDI - OK [ 1] MDI MDI MDI MDI Child MDI
More informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More information[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi
2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More informationAPI - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어
메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어서가장중요한부분이라고도할수있기때문입니다. 1. 새로운메크로생성 새메크로만들기버튺을클릭하여파일을생성합니다. 2. 메크로저장 -
More information<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>
Power Java 제 8 장클래스와객체 I 이번장에서학습할내용 클래스와객체 객체의일생직접 메소드클래스를 필드작성해 UML 봅시다. QUIZ 1. 객체는 속성과 동작을가지고있다. 2. 자동차가객체라면클래스는 설계도이다. 먼저앞장에서학습한클래스와객체의개념을복습해봅시다. 클래스의구성 클래스 (class) 는객체의설계도라할수있다. 클래스는필드와메소드로이루어진다.
More information학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2
학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 6.1 함수프로시저 6.2 서브프로시저 6.3 매개변수의전달방식 6.4 함수를이용한프로그래밍 3 프로시저 (Procedure) 프로시저 (Procedure) 란무엇인가? 논리적으로묶여있는하나의처리단위 내장프로시저 이벤트프로시저, 속성프로시저, 메서드, 비주얼베이직내장함수등
More informationDLL(Dynamic Linked Library)
제 11 장동적연결라이브러리 11.1 DLL 의링크 11.2 DLL 의종류 실습 11-1 Implicit 링킹을통한정규 DLL 달력만들기 실습 11-2 Explicit 링킹을통한정규 DLL 달력만들기 실습 11-3 확장 DLL 을통한주민등록번호조회 프로그램만들기 DLL(Dynamic Linked Library) DLL 이란? 동적연결라이브러리 프로그램내부에라이브러리가있는것이아니라따로독립적으로실행가능한파일
More informationMicrosoft Word - ntasFrameBuilderInstallGuide2.5.doc
NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,
More informationPowerPoint Presentation
객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean
More informationMicrosoft PowerPoint - chap06-5 [호환 모드]
2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.
More informationJAVA PROGRAMMING 실습 08.다형성
2015 학년도 2 학기 1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스
More information델파이 4 프로그래밍의 이해 (Understandings of Delphi 4 Programming)
델파이 4 프로그래밍의이해 (Understandings of Delphi 4 Programming) 오브젝트파스칼과심도있는델파이프로그래밍의세계로들어가기전에, 이번장에서는델파이를사용하여첫번째윈도우어플리케이션을제작하고전반적인델파이의환경에대해서알아볼것이다. 내용의수준이높지는않겠지만, 흔히알고있었던내용이라고하더라도별생각없이넘어갔던것들도많을것이다. 그러면, 델파이 4
More informationMicrosoft PowerPoint UI-Event.Notification(1.5h).pptx
To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 UI 이벤트 Event listener Touch mode Focus handling Notification Basic toast notification Customized toast notification Status bar notification 2 사용자가인터랙션하는특정 View
More informationMicrosoft PowerPoint - additional01.ppt [호환 모드]
1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능
More information. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요
. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요소로써안드로이드시스템에서는 Activities, Services, Content Providers,
More information임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수
More informationChapter #01 Subject
Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned
More information경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P
Duplicator 는기본적으로원본하드디스크를빠르게복사본하드디스크에복사하는기능을하는것입니다.. 복사본 하드디스크가원본하드디스크와똑같게하는것을목적으로하는것이어서저용량에서고용량으로복사시몇 가지문제점이발생할수있습니다. 하드디스크는사용하려면, 디스크초기화를한후에포맷을해야사용가능합니다. Windows PC는 MBR과 GPT 2 개중에 1개로초기화합니다. -Windows
More informationMicrosoft PowerPoint - Chap12-OOP.ppt
객체지향프로그래밍 (Object Oriented Programming) 12 장강사 강대기 차례 (Agenda) 멤버에대한동적메모리할당 암시적 / 명시적복사생성자 암시적 / 명시적오버로딩대입연산자 생성자에 new 사용하기 static 클래스멤버 객체에위치지정 new 사용하기 객체를지시하는포인터 StringBad 클래스 멤버에포인터사용 str static 멤버
More informationPowerPoint Presentation
Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음
More informationUI TASK & KEY EVENT
2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize
More informationISP and CodeVisionAVR C Compiler.hwp
USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler
More informationvar answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");
자바스크립트 (JavaScript) - HTML 은사용자에게인터페이스 (interface) 를제공하는언어 - 자바스크립트는서버로데이터를전송하지않고서할수있는데이터처리를수행한다. - 자바스크립트는 HTML 나 JSP 에서작성할수있고 ( 내부스크립트 ), 별도의파일로도작성이가능하다 ( 외 부스크립트 ). - 내부스크립트 - 외부스크립트
More informationMicrosoft PowerPoint - e pptx
Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells
More information쉽게 풀어쓴 C 프로그래밍
Power Java 제 7 장클래스와객체 이번장에서학습할내용 객체지향이란? 객체 메시지 클래스 객체지향의장점 String 클래스 객체지향개념을완벽하게이해해야만객체지향설계의이점을활용할수있다. 실제세계는객체로이루어진다. 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법 절차지향과객체지향 절차지향프로그래밍 (procedural programming): 문제를해결하는절차를중요하게생각하는방법
More informationJAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각
JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.
More informationMicrosoft PowerPoint 자바-기본문법(Ch2).pptx
자바기본문법 1. 기본사항 2. 자료형 3. 변수와상수 4. 연산자 1 주석 (Comments) 이해를돕기위한설명문 종류 // /* */ /** */ 활용예 javadoc HelloApplication.java 2 주석 (Comments) /* File name: HelloApplication.java Created by: Jung Created on: March
More informationC++ Programming
C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout
More information11장 포인터
누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리
More information슬라이드 1
정적메모리할당 (Static memory allocation) 일반적으로프로그램의실행에필요한메모리 ( 변수, 배열, 객체등 ) 는컴파일과정에서결정되고, 실행파일이메모리에로드될때할당되며, 종료후에반환됨 동적메모리할당 (Dynamic memory allocation) 프로그램의실행중에필요한메모리를할당받아사용하고, 사용이끝나면반환함 - 메모리를프로그램이직접관리해야함
More informationAPI 매뉴얼
PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned
More informationMicrosoft PowerPoint - chap10-함수의활용.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과
More information<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>
게임엔진 제 4 강프레임리스너와 OIS 입력시스템 이대현교수 한국산업기술대학교게임공학과 학습내용 프레임리스너의개념 프레임리스너를이용한엔터티의이동 OIS 입력시스템을이용한키보드입력의처리 게임루프 Initialization Game Logic Drawing N Exit? Y Finish 실제게임루프 오우거엔진의메인렌더링루프 Root::startRendering()
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
More informationC# Programming Guide - Types
C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든
More informationJUNIT 실습및발표
JUNIT 실습및발표 JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc API Document 를참조 JUNIT 4.8.1 다운로드 설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기 테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected
More information제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호
제이쿼리 () 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호 CSS와마찬가지로, 문서에존재하는여러엘리먼트를접근할수있다. 엘리먼트접근방법 $( 엘리먼트 ) : 일반적인접근방법
More information슬라이드 1
핚국산업기술대학교 제 14 강 GUI (III) 이대현교수 학습안내 학습목표 CEGUI 라이브러리를이용하여, 게임메뉴 UI 를구현해본다. 학습내용 CEGUI 레이아웃의로딩및렌더링. OIS 와 CEGUI 의연결. CEGUI 위젯과이벤트의연동. UI 구현 : 하드코딩방식 C++ 코드를이용하여, 코드내에서직접위젯들을생성및설정 CEGUI::PushButton* resumebutton
More informationPowerPoint 프레젠테이션
실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3
More informationMicrosoft Word - FunctionCall
Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack
More informationMicrosoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx
To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 Eclipse (IDE) JDK Android SDK with ADT IDE: Integrated Development Environment JDK: Java Development Kit (Java SDK) ADT: Android Development Tools 2 JDK 설치 Eclipse
More information<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>
연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.
More information1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a
6 장복사생성자 객체의생성과대입객체의값에의한전달복사생성자디폴트복사생성자복사생성자의재정의객체의값에의한반환임시객체 C++ 프로그래밍입문 1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y;
More information로거 자료실
redirection 매뉴얼 ( 개발자용 ) V1.5 Copyright 2002-2014 BizSpring Inc. All Rights Reserved. 본문서에대한저작권은 비즈스프링 에있습니다. - 1 - 목차 01 HTTP 표준 redirect 사용... 3 1.1 HTTP 표준 redirect 예시... 3 1.2 redirect 현상이여러번일어날경우예시...
More informationPowerPoint 프레젠테이션
인터페이스 배효철 th1g@nate.com 1 목차 인터페이스의역할 인터페이스선언 인터페이스구현 인터페이스사용 타입변환과다형성 인터페이스상속 디폴트메소드와인터페이스확장 2 인터페이스의역할 인터페이스란? 개발코드와객체가서로통신하는접점 개발코드는인터페이스의메소드만알고있으면 OK 인터페이스의역할 개발코드가객체에종속되지않게 -> 객체교체할수있도록하는역할 개발코드변경없이리턴값또는실행내용이다양해질수있음
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More informationPowerPoint 프레젠테이션
System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소
More informationMicrosoft PowerPoint 세션.ppt
웹프로그래밍 () 2006 년봄학기 문양세강원대학교컴퓨터과학과 세션변수 (Session Variable) (1/2) 쇼핑몰장바구니 장바구니에서는사용자가페이지를이동하더라도장바구니의구매물품리스트의내용을유지하고있어야함 PHP 에서사용하는일반적인변수는스크립트의수행이끝나면모두없어지기때문에페이지이동시변수의값을유지할수없음 이러한문제점을해결하기위해서 PHP 에서는세션 (session)
More information04장 메시지 처리 유형
4 장 메시지처리유형 김성영교수 금오공과대학교 컴퓨터공학부 메시지처리유형 윈도우에서발생하는이벤트에대응하는윈도우메시지를처리 2 장및 3 장의실습예제 자식윈도우에서발생한이벤트를부모윈도우에서처리 WM_COMMAND 메시지처리 실습 4.2 자식윈도우에서발생한사건유형을구분하여처리 Notification code 처리 실습 4.7 Notification code 의한계를극복하여처리
More information 메소드 오버로딩
객체지향언어로서의오브젝트파스칼 (Object Pascal As A OOP) 오브젝트파스칼의객체지향성을몰라도델파이어플리케이션을쉽게만들수있다. 단순히폼을하나만들고, 거기에여러가지컴포넌트들을추가하고, 이벤트핸들러에적당한내용의코드들을추가하면그걸로충분한것이다. 그렇지만, 이것을이해하면델파이가어떤방법으로작업을처리하는지이해할수있고, 자신만의컴포넌트를만들어내거나, 비교적커다란프로젝트를진행할때에커다란도움을받게될것이다.
More information설계란 무엇인가?
금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15 6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값,
More information제11장 프로세스와 쓰레드
제9장자바쓰레드 9.1 Thread 기초 (1/5) 프로그램 명령어들의연속 (a sequence of instruction) 프로세스 / Thread 실행중인프로그램 (program in execution) 프로세스생성과실행을위한함수들 자바 Thread 2 9.1 Thread 기초 (2/5) 프로세스단위작업의문제점 프로세스생성시오버헤드 컨텍스트스위치오버헤드
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향
More informationMicrosoft PowerPoint - chap01-C언어개요.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을
More information쉽게 풀어쓴 C 프로그래밍
제 3 장함수와문자열 1. 함수의기본적인개념을이해한다. 2. 인수와매개변수의개념을이해한다. 3. 함수의인수전달방법 2가지를이해한다 4. 중복함수를이해한다. 5. 디폴트매개변수를이해한다. 6. 문자열의구성을이해한다. 7. string 클래스의사용법을익힌다. 이번장에서만들어볼프로그램 함수란? 함수선언 함수호출 예제 #include using
More information오버라이딩 (Overriding)
WindowEvent WindowEvent 윈도우가열리거나 (opened) 닫힐때 (closed) 활성화되거나 (activated) 비활성화될때 (deactivated) 최소화되거나 (iconified) 복귀될때 (deiconified) 윈도우닫힘버튼을누를때 (closing) WindowEvent 수신자 abstract class WindowListener
More information구조화 저장소 기법
구조화저장소기법 (Structured Storage Technique) 만약정해진포맷의파일형식을써야하는것이아니라, 데이터를저장할때대단히유연하고도강력한방법이존재한다면얼마나편리할까? 구조화저장 (structured storage) 이라는새로운방식으로이러한문제를해결할수있다. 구조화저장은 DocFIle 이나 OLE 복합파일 (OLE compound file) 이라는이름으로도불리고있는새로운저장방식이다.
More information<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>
리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1
More informationMicrosoft PowerPoint - chap03-변수와데이터형.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다.
More informationMicrosoft PowerPoint 웹 연동 기술.pptx
웹프로그래밍및실습 ( g & Practice) 문양세강원대학교 IT 대학컴퓨터과학전공 URL 분석 (1/2) URL (Uniform Resource Locator) 프로토콜, 호스트, 포트, 경로, 비밀번호, User 등의정보를포함 예. http://kim:3759@www.hostname.com:80/doc/index.html URL 을속성별로분리하고자할경우
More informationMicrosoft PowerPoint - chap05-제어문.pptx
int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); 1 학습목표 제어문인,, 분기문에 대해 알아본다. 인 if와 switch의 사용 방법과 사용시 주의사항에 대해 알아본다.
More informationMicrosoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]
Chapter 03 변수와자료형 2009 한국항공대학교항공우주기계공학부 (http://mercury.kau.ac.kr/sjkwon) 1 변수와자료유형 변수 프로그램에서자료값을임시로기억할수있는저장공간을변수 (variables) 변수 (Variables) 는컴퓨터의메모리인 RAM(Random Access Memory) 에저장 물건을담는박스라고생각한다면박스의크기에따라담을물건이제한됨
More informationPowerPoint Presentation
Package Class 1 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section
More informationPowerPoint Template
16-1. 보조자료템플릿 (Template) 함수템플릿 클래스템플릿 Jong Hyuk Park 함수템플릿 Jong Hyuk Park 함수템플릿소개 함수템플릿 한번의함수정의로서로다른자료형에대해적용하는함수 예 int abs(int n) return n < 0? -n : n; double abs(double n) 함수 return n < 0? -n : n; //
More informationMicrosoft Word - src.doc
IPTV 서비스탐색및콘텐츠가이드 RI 시스템운용매뉴얼 목차 1. 서버설정방법... 5 1.1. 서비스탐색서버설정... 5 1.2. 컨텐츠가이드서버설정... 6 2. 서버운용방법... 7 2.1. 서비스탐색서버운용... 7 2.1.1. 서비스가이드서버실행... 7 2.1.2. 서비스가이드정보확인... 8 2.1.3. 서비스가이드정보추가... 9 2.1.4. 서비스가이드정보삭제...
More informationMicrosoft PowerPoint - 04windows.ppt
Game Programming I Windows 프로그래밍 (1) March 27, 2006 목표 윈도우프로그래밍에서이용되는이벤트구동프로그래밍모델의이해 Direct3D 를이용하는윈도우어플리케이션의작성을위한최소한의코드이해 윈도우 (Win32) 어플리케이션 Direct3D API ( 어플리케이션프로그래밍인터페이스 ) 를이용하기위해필요 Win32 API 를이용해작성
More informationMicrosoft PowerPoint - 07-Data Manipulation.pptx
Digital 3D Anthropometry 7. Data Analysis Sungmin Kim SEOUL NATIONAL UNIVERSITY Body 기본정보표시 Introduction 스케일조절하기 단면형상추출 단면정보관리 3D 단면형상표시 2 기본정보표시및스케일조절 UI 및핸들러구성 void fastcall TMainForm::BeginNewProject1Click(TObject
More informationq 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2
객체지향프로그래밍 IT CookBook, 자바로배우는쉬운자료구조 q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 q 객체지향프로그래밍의이해 v 프로그래밍기법의발달 A 군의사업발전 1 단계 구조적프로그래밍방식 3 q 객체지향프로그래밍의이해 A 군의사업발전 2 단계 객체지향프로그래밍방식 4 q 객체지향프로그래밍의이해 v 객체란무엇인가
More informationInfinity(∞) Strategy
반복제어 표월성 passwd74@cherub.sungkyul.edu 개요 for() 문 break문과 continue문 while문 do-while문 for() 문 for() 문형식 for( 표현식1; 표현식2; 표현식3) 여러문장들 ; 표현식 1 : 초기화 (1 번만수행 ) 표현식 2 : 반복문수행조건 ( 없으면무한반복 ) 표현식 3 : 반복문수행횟수 for()
More information슬라이드 1
Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치
More informationgnu-lee-oop-kor-lec10-1-chap10
어서와 Java 는처음이지! 제 10 장이벤트처리 이벤트분류 액션이벤트 키이벤트 마우스이동이벤트 어댑터클래스 스윙컴포넌트에의하여지원되는이벤트는크게두가지의카테고리로나누어진다. 사용자가버튼을클릭하는경우 사용자가메뉴항목을선택하는경우 사용자가텍스트필드에서엔터키를누르는경우 두개의버튼을만들어서패널의배경색을변경하는프로그램을작성하여보자. 이벤트리스너는하나만생성한다. class
More informationCluster management software
자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민 기본예제 예외클래스를정의하고사용하는예제 class NewException extends Exception { public class ExceptionTest { static void methoda() throws NewException { System.out.println("NewException
More information제8장 자바 GUI 프로그래밍 II
제8장 MVC Model 8.1 MVC 모델 (1/7) MVC (Model, View, Controller) 모델 스윙은 MVC 모델에기초를두고있다. MVC란 Xerox의연구소에서 Smalltalk 언어를바탕으로사용자인터페이스를개발하기위한방법 MVC는 3개의구성요소로구성 Model : 응용프로그램의자료를표현하기위한모델 View : 자료를시각적으로 (GUI 방식으로
More information쉽게 풀어쓴 C 프로그래밍
Power Java 제 20 장패키지 이번장에서학습할내용 패키지의개념 패키지로묶는방법 패키지사용 기본패키지 유틸리티패키지 패키지는연관된클래스들을묶는기법입니다. 패키지란? 패키지 (package) : 클래스들을묶은것 자바라이브러리도패키지로구성 ( 예 ) java.net 패키지 네트워크관련라이브러리 그림 20-1. 패키지의개념 예제 패키지생성하기 Q: 만약패키지문을사용하지않은경우에는어떻게되는가?
More information<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>
SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......
More informationMicrosoft PowerPoint - ch07 - 포인터 pm0415
2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자
More informationMicrosoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100
2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack
More informationJVM 메모리구조
조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.
More informationIP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1
IP 심화 º 각 P 의게이트웨이는해당네트워크의마지막주소를사용한다. - P1 (210.220.10.1/26) 의게이트웨이 (5의 Fa0/0) : 210.220.10.63 /26 = 255.255.255.192 호스트비트수 : 32-26 = 6 비트 => = 64 그러므로 P1의 IP 210.220.10.1 중서브넷마스크에의거 26비트는변함이없고, 나머지 6비트가호스트비트로변하므로
More informationMicrosoft Word - hook3.doc
개발자를위한윈도우후킹테크닉 메시지훅이용한 Spy++ 흉내내기 우리는지난강좌에서후킹을하는기초적인방법과사용되는 API 들을비롯해서후킹함수가호출되는컨텍스트에대해서배웠다. 이번강좌에서는 WH_GETMESSAGE 훅을통해서 Spy++ 과유사한프로그램을제작할것이다. 이과정에서 Windows 애플리케이션이메시지를처리하는과정과윈도우를열거하는방법에대해서알아보도록하자. 목차
More informationWindows 8에서 BioStar 1 설치하기
/ 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar
More informationWINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역
WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역시쉽게해결할수있다. 이번화이트페이퍼에서는 Window Function 중순위 RANK, ROW_NUMBER,
More informationJDK이클립스
JDK 와이클립스설치 A. JDK 다운로드, 설치및환경설정 지금부터 JDK를다운로드받아설치하고 JDK를윈도우에서활용할수있도록환경을설정하는전과정을소개한다. 다운로드 www.oracle.com 사이트에접속하여 Downloads 메뉴를선택한후 [ 그림 1] 과같이 "Java for Developers" 를클릭한다. [ 그림 1] www.oracle.com 사이트
More information(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])
예외와예외클래스 예외처리 514760-1 2016 년가을학기 12/08/2016 박경신 오류의종류 에러 (Error) 하드웨어의잘못된동작또는고장으로인한오류 에러가발생되면 JVM실행에문제가있으므로프로그램종료 정상실행상태로돌아갈수없음 예외 (Exception) 사용자의잘못된조작또는개발자의잘못된코딩으로인한오류 예외가발생되면프로그램종료 예외처리 추가하면정상실행상태로돌아갈수있음
More information歯처리.PDF
E06 (Exception) 1 (Report) : { $I- } { I/O } Assign(InFile, InputName); Reset(InFile); { $I+ } { I/O } if IOResult 0 then { }; (Exception) 2 2 (Settling State) Post OnValidate BeforePost Post Settling
More information쉽게 풀어쓴 C 프로그래밍
제 5 장생성자와접근제어 1. 객체지향기법을이해한다. 2. 클래스를작성할수있다. 3. 클래스에서객체를생성할수있다. 4. 생성자를이용하여객체를초기화할수 있다. 5. 접근자와설정자를사용할수있다. 이번장에서만들어볼프로그램 생성자 생성자 (constructor) 는초기화를담당하는함수 생성자가필요한이유 #include using namespace
More informationMicrosoft PowerPoint - C++ 5 .pptx
C++ 언어프로그래밍 한밭대학교전자. 제어공학과이승호교수 연산자중복 (operator overloading) 이란? 2 1. 연산자중복이란? 1) 기존에미리정의되어있는연산자 (+, -, /, * 등 ) 들을프로그래머의의도에맞도록새롭게정의하여사용할수있도록지원하는기능 2) 연산자를특정한기능을수행하도록재정의하여사용하면여러가지이점을가질수있음 3) 하나의기능이프로그래머의의도에따라바뀌어동작하는다형성
More information- 목차 - - ios 개발환경및유의사항. - 플랫폼 ios Project. - Native Controller와플랫폼화면연동. - 플랫폼 Web(js)-Native 간데이터공유. - 플랫폼확장 WN Interface 함수개발. - Network Manager clas
플랫폼사용을위한 ios Native Guide - 목차 - - ios 개발환경및유의사항. - 플랫폼 ios Project. - Native Controller와플랫폼화면연동. - 플랫폼 Web(js)-Native 간데이터공유. - 플랫폼확장 WN Interface 함수개발. - Network Manager class 개발. - Native Controller에서
More information2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an
1 Application Name: Day10_yhg 예제 10-9 activity_main.xml
More informationMicrosoft Word - 3부A windows 환경 IVF + visual studio.doc
Visual Studio 2005 + Intel Visual Fortran 9.1 install Intel Visual Fortran 9.1 intel Visual Fortran Compiler 9.1 만설치해서 DOS 모드에서실행할수있지만, Visual Studio 2005 의 IDE 를사용하기위해서는 Visual Studio 2005 를먼저설치후 Integration
More informationChapter 4. LISTS
C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or
More information17장 클래스와 메소드
17 장클래스와메소드 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 1 / 18 학습내용 객체지향특징들객체출력 init 메소드 str 메소드연산자재정의타입기반의버전다형성 (polymorphism) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 2 / 18 객체지향특징들 객체지향프로그래밍의특징 프로그램은객체와함수정의로구성되며대부분의계산은객체에대한연산으로표현됨객체의정의는
More informationPowerPoint 프레젠테이션
Win32 API Windows Programming 1 http://idb.korea.ac.kr DB & Mining LAB. Korea Univ. 최종업데이트 : 2012. 08. 14 1 컴퓨터시스템의주요구성요소 2 2 컴퓨터하드웨어구성 Fetch : 메인메모리에저장되어있는명령어를 CPU 로 Decode : 컨트롤유닛에의해분석 Execution : ALU
More information