요즘 아별 엑셀 툴을 개발하면서 VBA가 제공하는 기능에 한계를 느껴
Win32 API를 공부하고 있습니다.
이 게시물은 제가 공부하면서 참고한 강좌들을 주르륵 열거해볼 생각입니다.
머.. 어떤 주제든지 처음 배우시는 분들은 똑같은 생각일테니까요..
일단 Win32 API에 대해 공부하려면 아래 강좌를 통해서 개념을 잡아주는게 좋을 것 같습니다.
0. Win32 API 뭥미? 하는 사람들에게 필요한 강좌
http://examo.co.kr/tn/board.php?board=qqqApi&page=6&command=body&no=41
==> API라 함은 Application Programming Interface의 약자로 "응용 프로그래밍 인터페이스" ^-^;;
그중에서도 Win32 API라 함은..
운영체제와 응용프로그램 사이에 정보 교환을 위한 인터페이스라고나 할까.. ^-^;;
그냥 윈도우기반 프로그래밍할때 필요한 함수와 정의들을 사용하기 위해 필요하다고 생각하세요.. ㅎㅎ
VB에서는 윈도우즈에서 제공하는 함수 목록(라이브러리)을 참조가 아닌 선언(Declare)해서 사용한다고 하네요.
VB가 할 수 없는 윈도우즈 핸들링이나 윈도우즈 기본 기능 또는 정보 등을 변경/참조할때 많이 사용합니다.
1. VBA에서 Win32 API 사용하는 방법.. 어떻게 선언하고 어떻게 사용할것인가?
[Win32 API] 1. 윈도우 버전을 구하는 방법 - [1] API의 선언문 작성법 알아보기 <= 회원 가입이 필요합니다.
==> 항상 궁금했던.. 왜 API는 사용하기전에 저따구로 선언을 한 다음에 사용할까 하는 부분을 알려주시는군요.
Declare Function GetTempFileName Lib "Kernel32.dll" Alias "GetTempFileNameA" (ByVal lpPathName As String, _
ByVal lpPrefixString As String, _
ByVal uUnique As Long, _
ByVal lpTempFileName As String) As Long
Declare : 정의하죠
Function : 함수를
GetTempFileName : 정의할 함수죠.. MSDN에서 확인이 가능합니다.
Lib : 윈도우즈 라이브러리를 참조할꺼란거죠..
"Kernel32.dll" : 저 GetTempFileName가 정의되어 있는 라이브러리 이름이죠.. 역시 MSDN에서 확인한거죠.
Alias : 대안으로 사용할 이름이란거죠. VB에서 이름 충돌이나 쓸수 없는 이름일경우를 대비한거죠~
"GetTempFileNameA" : 대안으로 사용할 이름이죠. 끝에 A는 ANSI라서 그런거 같죠.
ByVal lpPathName As Stiring : ByVal 참조 형식이 값이죠. lpPathName 변수명이죠. As String 문자열 형식이란거죠.
ByVal ... 나머지.. : 위의 변수 정의한거랑 똑같죠?
1-2. 아래 사이트에서 잘 정리된 PPT자료를 발견했습니다.
카페 가입하셔야하는데.. 카페 가입하시고.. 인사말만 적으면 바로 볼 수 있습니다. (chapter19-1.ppt 파일을 보세요..)
http://cafe.naver.com/javacircle/4524
2. 아래 사이트는 책(윈도우즈 API 정복)의 내용을 요약한건지 퍼온건지.. 그랬네요..
http://bartsesang.tistory.com/tag/API%20정복정복
3. 아래 사이트에 Win32 API 강좌가 있습니다. C를 기준으로 설명을 해봐서.. 음.. 머 비슷하죠.. ㅋ
--> 2011.12.1일자로 도메인을 soen으로 변경했네요.. http://www.soen.kr
API 함수 중 자주 사용되는 함수가 정리된 것입니다.
네이버카페(xlsvba.cafe)의 수학쟁이님이 정리한 것을 퍼왔습니다.
상세 출처 : http://cafe.naver.com/xlsvba/1736
[API] Win32 API 개요 - API를 종류별로 간략하게 분류한 문서
실무에서 많이 쓰일법한 API만을 모아서 정리해봤습니다...^^; API를 공부하시면서 모르는 API가 생긴다면 이 문서에서 간단하게 뜻을 알아두는 것도 괜찮을 듯 싶습니다...
- 16-bit Compatibility(16비트 호환성)을 위해 제공되는 obsoleted(대체된) API도 같이 실어보았습니다. - 간단한 사용 목적만 풀이하였고, 자세한 풀이 과정은 카페 검색 및 MSDN를 참고로 하시기 바랍니다.
*** 창 관련 API
- CreateWindowEx: 창을 생성하는 API - DestroyWindow: (같은 스레드의) 창의 클라이언트 영역 파괴 (WM_DESTROY 메시지 발생) - CloseWindow: (같은 스레드의) 창을 최소화시킨다. - ShowWindow: (같은 스레드의) 창을 보이거나 숨긴다. (C++ Windows API 프로그래밍에서 주로 쓰는 API) - SendMessage: 창에 메시지를 보낸다. 메시지 처리 될때까지 대기한다. - PostMessage: 창에 메시지를 보내고, 큐에 붙인 채로 처리는 끝난다. - SendMessageTimeout: 메시지를 보내고 처리를 대기하되, 시간 제한을 둔다. (SendMessage() 함수가 무한정 대기하는 것을 미연에 방지하기 위해 나온 함수) - GetMessage: 메시지 큐에서 메시지를 꺼낸다. - PeekMessage: 메시지 큐에서 메시지를 꺼낸다. - TranslateMessage: WM_KEYDOWN/WM_KEYUP 메시지를 WM_CHAR/WM_DEADCHAR 메시지로 변형시킨다. - DispatchMessage: (같은 스레드의) 창 프로시저에 메시지를 전송한다. - CallWindowProc: 창 프로시저를 임의로 호출하는 API - DefWIndowProc: Windows의 기본 창 프로시저를 호출하는 API - MoveWindow: 창의 위치를 변경할 수 있는 API - SetWindowPos: 창의 위치와 Z축 좌표, 그리고 여러가지 플래그를 줄 수 있는 API - GetWindowLong: 지정된 창의 속성(GWL_XXX)의 값을 반환한다. (예: GWL_STYLE, GWL_WNDPROC, GWL_HINSTANCE) *** 그 중 GWL_STYLE은 창 스타일 플래그로 이루어져 있다. (WS_XXX/WS_EX_XXX 의 비트 조합) - SetWindowLong: 지정된 창의 속성(GWL_XXX)의 값을 설정한다. - MsgWaitForMultipleObjectsEx: 커널 함수 WaitForMultipleObjectsEx의 메시지 확장 버전이다. - FindWindow: 창을 검색하는 API - FindWindowEx: 창을 검색하는 API. FindWindow의 확장판(Extended)으로 부모창과 같은 준위의 기준 창을 지정할 수 있다. - GetActiveWindow: 현재 스레드에 속한 활성화창의 HWND(창 핸들) 값을 반환한다. - GetForegroundWindow: 시스템 전역의 활성화 창의 창 핸들 값을 반환한다. - GetDesktopWindow: 바탕 화면(Shell Process(Explorer.exe)에 속한 Window)의 창 핸들 값을 반환한다. - GetWindowThreadProcessId: 창 핸들으로부터 스레드 식별자나 프로세스 식별자를 얻는 데에 사용한다.
*** 입력 처리 관련 API
- AttachThreadInput: 현재 스레드 입력 큐를 다른 스레드 입력 큐에 붙인다. - BlockInput: 키보드/마우스 입력의 수신을 차단할 지 결정한다. - ClipCursor: 마우스 커서를 특정 영역에 묶는 API - keybd_event: 키보드 이벤트를 발생시키는 API - mouse_event: 마우스 이벤트를 발생시키는 API - SendInput: 키보드/마우스 이벤트를 발생시키는 API - SetWindowsHook(obsoleted/대체됨): SetWindowsHookEx로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. - SetWindowsHookEx: 윈도우 훅을 설치하는 API - DefHookProc(obsoleted/대체됨): CallNextHookEx으로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. - CallNextHookEx: 다음 후크 체인에 훅 정보를 넘긴다. 다음 훅 체인이 없다면 비로소 시스템이 해당 훅을 처리한다.
*** 마우스 커서 관련 API
- GetCursorInfo: 커서 정보를 가져오는 API - GetCursor: 커서의 HCURSOR 핸들을 반환하는 API - SetCursor: 커서 설정 API - SetSystemCursor: 시스템 커서를 설정한다.
*** 파일 관련 API
_lcreat/_lopen(obsoleted/대체됨): CreateFile로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. _lclose(obsoleted/대체됨): CloseHandle로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. _lread(obsoleted/대체됨): ReadFile로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. _lwrite(obsoleted/대체됨): WriteFile로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. _llseek(obsoleted/대체됨): SetFilePointer로 대체되었다. 현재는 16비트 후방 호환성을 위해서만 제공된다. CreateFile: 파일을 생성하는 API CreateFileMapping: 파일을 메모리에 매핑하기 위해 파일매핑 개체를 생성한다. ReadFile: 파일을 읽는 APi WriteFile: 파일을 쓰는 API SetFilePointer: 파일 포인터(현재 파일이 써질/읽어질 부분의 오프셋, 즉 위치 값)를 쓴다. *** 간단한 팁: 파일 포인터를 읽으려면 2번째 인수에 0을 넣고, 4번째 인수에 FILE_CURRENT을 넣은 후, 반환값(하위 32비트)과 3번째 인수에서 지정한 변수의 값(상위 32비트)을 참조하면 알아낼 수 있다. CloseHandle: 핸들을 닫는 API. 내부적으로 커널 개체의 Reference Count가 1 감소하며, 이 Count가 0이 되었을 때 비로소 메모리에서 제거된다. (*** 핸들을 제대로 닫지 않으면 메모리 누수가 발생한다.) MapViewOfFile(Ex): 파일 매핑 개체를 메모리에 매핑하는 함수 UnmapViewOfFile: 메모리에 매핑된 파일을 매핑 해제하는 함수 GetMappedFileName: 메모리에 매핑된 파일의 파일 이름을 구하는 함수 *** 주의: 이 API는 psapi.dll의 API입니다. NT4 에서는 기본 지원하지 않는 함수로, 이 함수는 내부적으로 ZwQueryVirtualMemory NTAPI를 호출하는데, 이를 직접 호출하여 직접 파일 이름을 구할 수도 있습니다.
*** 프로세스 관련 API
CreateProcess: 프로세스를 생성하는 API CreateProcessAsUser: 프로세스를 생성하는 API. 실행될 사용자를 지정할 수 있다. OpenProcess: 프로세스를 열어 핸들을 반환받는 API ExitProcess: 현재 프로세스를 종료하는 API TerminateProcess: 프로세스를 강제로 종료하는 API *** 주의: 이 함수는 ExitProcess와 달리 Process Cleanup 과정이 발생하지 않습니다. 따라서 일부 프로세스는 이 함수로 종료할 시 매우 심각한 현상을 초래할 수 있습니다. GetExitCodeProcess: 프로세스의 종료 코드를 반환받는 API. 종료가 되지 않고 동작중이라면 STILL_ACTIVE(259)가 반환된다. Process32First/Process32Next: CreateToolhelp32Snapshot으로 생성된 스냅샷 개체로부터 프로세스 목록의 항목을 하나씩 반환해주는 함수이다.
*** 디버깅 관련 API
ReadProcessMemory: 다른 프로세스의 메모리를 읽는다. WriteProcessMemory: 다른 프로세스의 메모리를 쓴다. VirtualQueryEx: 다른 프로세스의 가상 메모리 정보를 얻는다. VirtualProtectEx: 다른 프로세스의 가상 메모리 보호 옵션을 조정한다. DebugActiveProcess: 실행중인 프로세스를 디버깅한다. DebugActiveProcessStop: DebugActiveProcess를 중단한다. DebugBreak: 중단점 예외(인터럽트 3)를 현재 프로세스에서 발생시킨다. DebugBreakProcess: 중단점 예외(인터럽트 3)를 다른 프로세스에서 발생시킨다. CreateRemoteThread: 스레드를 원격에서 생성시킨다. DebugSetProcessKillOnExit: 디버거가 종료될 때 디버깅 당하는 프로세스가 종료되지 않게 할 수 있다. |