창조유저그룹-커즈닷컴
Window close
ID :     PASS :   
   
  처음으로
  창조
  창조 소개
창조 다운로드
CUGz.com 소개
온라인 도움말
  커뮤니티
  가입인사
자유게시판
Q/A게시판
TIP/TECH
열린강좌
자주하는질문
아이디어게시판
  자료실
  소스자료실
프로그램자료실
기타자료실
명예의 전당
이미지 자료실
  지원/기타
  표준용어재정
구글 웹서치  
관리자 전용


LIST ALL
Posted by 지상현2005-09-04 19:17:27, Hit : 6331
창조로 빠져보는 API #2
Homepage : http://ssidang.x-y.net
Post URL : http://cugz.sjworks.net/bbs/zboard.php?id=open_lec&no=81
---------------------------------------------------------------------------------
밥 먹고 왔습니다 -_-
그리고 친구들이 스타 하자고 졸라서 조금 하고 왔습니다;;
역시 존칭을 생략하고 열심히 써보겠습니다~
---------------------------------------------------------------------------------




3. API는 어떻게 이루어지나?
대부분의 API에는 “핸들”이란 개념이 사용된다

API를 보다 보면 핸들이라는 것이 참 많이 나온다.
대체 핸들이 뭐지?

핸들은 손잡이란 뜻이다. 예를 들어, 어떤 창의 제목을 바꾸기 위해 API를 쓴다 하면, 어떻게 명령할 것인가?

: 어이, “창이름바꿔”! 저 창의 제목을 이러이러하게 바꿔줘!
API: -_-
: 빨리 바꾸라니깐!
API: 무슨 창의 이름을 바꾸는데? -_-
: 아 그렇네. 저기 보이지? 저기 있는 창 말이야.
API: 저기 있는 창”이 대체 뭐얏!
: 아 답답해! 저기 "제목 없음 - 메모장" 이라고 쓰인 창!

자, 한 가지 방법이 나왔다. 창의 제목으로 호출하는 방법.
그러나 API가 다시 묻는다.

API: 이거 봐. "제목 없음 - 메모장" 이라고 쓰인 창이 한두개야?
아우... 저기 있는 저 창인데...
API: 번호를 불러 봐!
: 그래, 저기 3번째 창...

또 다른 방법이 나왔다. 번호를 붙이는 방법.
핸들이란 이런 것이다. 내가 API로 3번 창의 이름을 바꾸라고 윈도에게 명령을 한다. 그러면 윈도는 출석부를 보고 3번 창을 찾아낸다. 그리고 확 개명 신청을 한다 *-_-*

어떤 객체든지 항상 내용이 바뀔 수 있다.
그렇지만 객체의 이름은 변하지 않는다. 그래서 창조에선 제목이 같은 두 개의 버튼을 서로 다른 것으로 인식할 수 있는 것이다.
핸들은, 이러한 객체의 이름을 번호로 나타낸 것에 불과하다.

따라서 우리는 어떤 창의 번호(핸들)를 알려줌으로서 어떤 객체(창 같은...)에게 명령을 내릴 수 있는 것이다.

대부분의 API는 어떤 객체(핸들)을 제어하고 상태를 알아오는 함수의 묶음, 또는 그렇지 않은 함수들로 이루어져 있다.

예를 들어, 아까 창의 이름을 바꾸는 함수, 창을 죽이는 함수...따위는 “창”이란 객체를 다루는 함수들이다. 또 그러한 함수들은 대부분 첫 번째 인자에 핸들을 넣는다.
그렇지 않은 함수로는 객체를 다루지 않는 함수, 즉 Beep 같이 그냥 삑소리를 내는 함수들이 있다.





4. 함수의 원형을 왜 써줘야 해?
함수를 부르기 위해서는 원형이 있어야 한다

어떤 함수를 부르기 위해서는, 일단 이름을 알아야 한다. API 함수의 갯수가 수천개가 넘는데 “야! 거기 너!” 라고 부른다고 딱 내가 원하는 함수가 따라오겠는가?
위에 예에서, 창의 제목을 바꾸는 API 함수의 이름은 SetWindowTextA 이다. (왜 A가 붙는지는, 다음 장에서 설명을...)

그렇다고 바로 SetWindowTextA 에게 일을 한다고 될까? 네가 바꿔줘야 할 이름은 뭐고, 바꿀 창이 뭔지 일일이 일러줘야 한다.
하지만... 생각해보자. 우리는 DLL을 알고 있다. 그런데 DLL이 나를 알까? 지금도 수백개의 프로그램이 탄생하고 있을텐데 DLL이 우릴 알 리가 없다.

따라서 DLL이 우리에게 맞춰줄 순 없다. 우리가 DLL에게 맞춰줘야 하는 것이다.
그래서, DLL 안에 있는 SetWindowTextA가 우리에게 이렇게 요구한다. “나는 창의 핸들과 바꿔줄 이름이 필요하니까, 그 순서대로 줘

시키는 대로 해야지 어쩔 수가 없다. 그러니 우리는 창조에게 “저 놈이 창의 핸들과 그 다음에 바꿀 이름을 달라고 하니까, 그렇게 갖다 줘” 하고 알려주면, 창조는 잘 갖다준다. 그러면서 답례로 반환값을 받아오게 된다. 우리는 그 값을 써도 그만 안써도 그만이다. 다시 말해, 함수의 반환값은 내 마음대로 해도 별 상관은 없다는 것이다.

핵심만 요약하면

1) 다른건 몰라도 인자만큼은 DLL과 그 함수가 요구하는 대로 딱딱 넘겨주어야 한다.
2) 반환값은 딱딱 지정해주지 않아도 된다. (실수를 반환하는 함수를 그냥 함수로 선언하면, 단지 값이 버려질 뿐이다) => 나중에 꽁수로 사용될 것이다





5. 함수 호출 관례: 이 함수에게 인자를 어떻게 보내주지?
함수에게 인자를 보내는 방법은 여러가지가 있다

<<API 함수 이외의 DLL을 호출하거나, 또는 DLL을 만들때 필요한 내용입니다>>

함수, 그리운 그대에게 인자를 보내는 방법은 한가지가 아니다.
그 중에서 많이 쓰는 것 두 가지를 소개하자면 stdcall, cdecl 이라는 방법이 있다.

stdcall 은 표준 호출 관례로, 모든 API는 stdcall 로 인자를 넘겨준다.
cdecl 은 C 호출 관례로, 흔히 C로 만든 DLL은 cdecl 으로 인자를 넘겨준다.

두 방식은 많이 비슷하지만, 결정적으로 한가지 다른 점이 있다.

공통점 - 둘 다 인자를 보낼 때, 스택이라 불리는 메모리에 인자를 거꾸로(마지막 인자부터 첫번째 인자까지) 집어 넣는다.

차이점
stdcall
- 스택에 집어넣었던 인자들을 DLL 함수 쪽에서 몽땅 처리한다.
cdecl - 스택에 집어넣었던 인자들을 가만 두고 반환한다. 함수를 불렀던 쪽에서 처리하도록 둔다.

창조는 API를 위해 stdcall 로만 함수를 호출한다. 따라서, 그냥 API나 stdcall 로 된 함수를 호출할 때는 아무 문제가 없다.
문제는 동작 방식이 조금 다른 cdecl 로 된 함수를 호출할 때이다.
cdecl 은 인자를 넘길 때 사용한 메모리를 가만 두기 때문에, 함수를 호출할 때마다 조금씩 쌓일것이고, 최후에는 메모리 부족 오류가 날 것이다. 더 무서운 점은 함수가 반환하기 위해서 원래 위치를 저장하는데 그 것을 인자를 저장하는 곳과 같은 곳에 둔다. 따라서 이상한 곳으로 함수가 되돌아가는 수가 생긴다. 이러면 접근 침범(Access Violation) 오류가 난다.

결론은, 창조에서 stdcall 이 아닌 함수를 호출하는 짓은 말아야 한다!
(하지 말라는 짓을 하면, 윈도가 오류로서 보답해준다)





2회 강좌 끝

애초에 하기로 했던 다른 언어로 선언된 함수를 창조식으로 바꾸는 방법은 결국 못했네요 -_-
3회에서 하기로 합시다~ 흐흐

손상진   2005-09-04 PM 7:49:05  
재밌게 잘읽었습니다..^^..
이해가 퐉퐉 되네요^^.
qkrwhdgns   2005-09-04 PM 8:19:46  
(하지 말라는 짓을 하면, 윈도가 오류로서 보답해준다) 이 문장..
재밌네요 ─_─ㅋ / 그리고.. API에 대해.. 한걸음 다가선 느낌^^
강성민   2005-10-23 AM 11:08:15  
오류로 보답해준다,,, 재미있어요 ㅎㅎ
LIST ALL               GO TO THE TOP


N
   Subject
Posted by
Date
H
119
   효과적인 조건문을 위한 논리연산자 [4]
박종훈 2006/10/15  6039
118
   환경파일로 파워유저되어보자![개정판] [예제/사용!] 2 [6]
박종훈 2007/01/02  7764
117
   환경파일로 파워유저되어보자![개정판] [설명] 1 -- 완성
박종훈 2007/01/02  6110
116
       환경문 강좌..^^; [진리형 자료] [1]
qkrwhdgns 2006/01/11  5020
115
         환경문 강좌..^^; [예제 소스]
qkrwhdgns 2006/01/11  5281
114
     환경문 강좌..^^; [실수형 자료] [1]
qkrwhdgns 2006/01/11  5250
113
   환경문 강좌..^^; [문자형 자료] [8]
qkrwhdgns 2006/01/10  5637
112
     호현계산기2 Rev2 [6]
박종훈 2009/10/23  5870
111
   한글이 입력되기까지 [4]
지상현 2006/07/29  6470
110
   컴퓨터에서 소수점을 표기하는 방식에 대해 [1]
지상현 2012/01/03  7512
109
   창조입문. :창조란 무엇인가?&CDP만들기: [9]
변혁수 2002/09/06  9941
108
   창조입문 : 메모장 만들기 [2]
신용주 2008/12/20  7550
107
   창조의 한계를 뛰어 넘어서 #1: '문자' 포인터 써먹기 [4]
지상현 2004/11/23  6935
106
   창조의 변수형에 대한 고찰 [1]
지상현 2012/01/03  5781
105
   창조와 ActiveX (2)
지상현 2007/08/11  10791
104
   창조와 ActiveX (1)
지상현 2007/08/07  8277
103
   창조에서 반올림하기 [1]
지상현 2013/01/05  5006
102
   창조로 빠져보는 API #3 [13]
지상현 2005/09/04  7267

   창조로 빠져보는 API #2 [3]
지상현 2005/09/04  6331
100
   창조로 빠져보는 API #1 [2]
지상현 2005/09/04  7047
99
   창조 초보자들을 위한 아주 기본적인 사용법
김대명 2011/03/09  6220
98
   창조 첫 시작시 명령어 익혀보자~ [4]
박종훈 2006/12/23  8042
97
   창조 시작단계 문법배워볼까? [M 0608181240] [8]
박종훈 2006/08/17  6513
96
   창조 로 만든 프로그램의 메모리 사용률을 낮춰보자 [2]
Pueding 2002/09/08  7092
95
   재미있는 포인터 강좌 -1- [2]
지상현 2005/10/12  6276
LIST ALL   1 [2][3][4][5] Next
Copyright 1999-2024 Zeroboard / skin by reedyfox in miniwini style
로그인
지우개 Expert 3.0
제작자 : 천호성 님 [LINK]
로그인
대박로또2005
제작자 : 최재일 님 [LINK]
로그인
1박종훈15292 점
2지상현8809 점
3손상진7388 점
4권선중6060 점
5이진백5174 점
로그인
가입일닉네임
05/31김동률
03/31홍형기
09/01o00pp99oo
12/27이재민
11/20이희철
로그인