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


LIST ALL
Posted by 지상현2005-09-04 19:17:27, Hit : 6329
창조로 빠져보는 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
94
   환경파일로 파워유저되어보자![개정판] [설명] 1 -- 완성
박종훈 2007/01/02  6109
93
   ㅎ사용자함수 알아보기! [2]
박종훈 2006/12/24  5394
92
   '변수'와의 인터뷰 -_-; [5]
박종훈 2006/12/24  5355
91
   창조 첫 시작시 명령어 익혀보자~ [4]
박종훈 2006/12/23  8038
90
   쉽고 빠르게 프로그래밍 하기 위한 방법들
장규형 2006/11/22  5394
89
   효과적인 조건문을 위한 논리연산자 [4]
박종훈 2006/10/15  6034
88
   [창조x] 수줍은 pda프로그래밍시작
이진백 2006/09/11  5790
87
   API사용을 위한 창조 구조체다루기 [M_S 0608190928] [3]
박종훈 2006/08/18  5547
86
   창조 시작단계 문법배워볼까? [M 0608181240] [8]
박종훈 2006/08/17  6507
85
   한글이 입력되기까지 [4]
지상현 2006/07/29  6460
84
   스크린세이버에대한 분석 [5]
박재성[날개달기] 2006/03/08  5281
83
   몇가지 유용한 정보 모음 [5]
최재일 2006/01/13  9350
82
   환경문 강좌..^^; [문자형 자료] [8]
qkrwhdgns 2006/01/10  5637
81
     환경문 강좌..^^; [실수형 자료] [1]
qkrwhdgns 2006/01/11  5245
80
       환경문 강좌..^^; [진리형 자료] [1]
qkrwhdgns 2006/01/11  5017
79
         환경문 강좌..^^; [예제 소스]
qkrwhdgns 2006/01/11  5279
78
   재미있는 포인터 강좌 -1- [2]
지상현 2005/10/12  6274
77
   #1 비트 연산이란? - 진수 표기법
지상현 2005/10/09  11386
76
   [요청강좌#14] DLL제작 강의 (미완성) [4]
이진백 2005/10/09  5605
75
     [re] [요청강좌#14] DLL제작 강의 (미완성) [2]
지상현 2005/10/09  6669
74
   창조로 빠져보는 API #3 [13]
지상현 2005/09/04  7263

   창조로 빠져보는 API #2 [3]
지상현 2005/09/04  6329
72
   창조로 빠져보는 API #1 [2]
지상현 2005/09/04  7042
71
   [폴더선택창보여]명령어의 언어 한글로 [8]
qkrwhdgns 2005/08/27  5448
70
   [ps.구루 강좌#13] 창조에서는 델파이에서 만든 DLL만 가능합니까? [1]
이진백 2005/07/22  5959
LIST ALL   Prev [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이희철
로그인