윈도우즈의 역사

윈도우즈는 미국의 Microsoft 사에서 만들었으며,  MS-DOS(ms-dos도 Microsoft 사가 개발한 것이다) 에 비해 주목을 받지 못하다가, 3.1 부터 주목 받기 시작한다.


[3.1 버전은 '애플리케이션'이었던 3.0 이하와 달리, '운영체제'다.]


이후 윈도우즈는 9x 시리즈로 이어진다.



특징 및 장점


도스와 비교하였을 때의 장점이다.

1. 그래픽 기반의 운영체제이다.

 화면처리를 문자단위가 아니라 픽셀(Pixel)로 처리하므로 점 단위의 출력이 가능하다.


2. 멀티 태스킹이 가능하다. 

다수의 작업을 동시에 수행 할 수 있는 멀티태스킹 운영체제이다.


3. 메시지 구동 시스템이다.

응용 프로그램은 입력 장치로부터의 입력을 직접 읽을 수 없기에, 운영체제가 대신 입력받아 전달해주는데, 이것을 메시지 라고한다. 이런 방식을 메시지 구동 시스템(Message Driven 혹은 Event Driven)이라고 한다. 즉, 프로그램의 실행순서는 실행 중에 사용자가 조작하는 순서 == 발생하는 메시지의 순서를 따른다.


4. 장치에 독립적이다.

윈도우즈는 디바이스 드라이버(Device Driver)에 의해 주변 장치들을 제어하고 관리한다. 장치가 바뀌면 Device Driver를 교체하면 될 뿐, 응용 프로그램은 이에 영향을 받지 않는다.  즉. 사용자의 시스템 구성에 따라프로그램이 달라질 필요가 없어 신경쓰지 않아도 된다.


5. 일관성이 있다.

사용자가 프로그램에게 명령을 내리는 인터페이스 구성이 표준화되어있다. (ex 파일 열기 , 글꼴 대화상자 등)


6. 리소스(Resource)가 분리되어있다.

리소스(resource)란 코드(code)의 반대 의미로, 응용 프로그램에서 필요한 여러가지 데이터를 말한다. 코드를 제외한 모든 것이 리소스가 될 수 있다. 

메뉴 , 아이콘 , 이미지 등이 그 예로, 윈도우즈는 여러 자원을 리소스로 정의한 후, 최종 실행 파일에 합치므로 분업에 효율적이 되었다.



API란?

Application Programing Interface 의 약어로, 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합 == 인터페이스 라고 할 수 있다.


응용 프로그램은 운영체제가 규정한 바 대로 하드웨어에 접근해야하는데.. 응용 프로그램 개발자들이 운영체제의 동작까지 이해하기는 어렵다. 때문에 운영체제의 기본적인 동작을 하는 함수집합을 응용 프로그램에게 제공한다.



여러가지 개발 방법

SDK.

클래스 라이브러리

비주얼  툴



API를 알아야하는 이유?

1. 운영체제를 이해하기 위해.

API 함수란, 운영체제가 제공하는 함수이며. 운영체제가 직접 사용하는 함수이기도 하다. 따라서 운영체제에 가장 가까우며 그 자체를 가장 잘 설명한다.


2. 어차피 알아야한다.

API 함수를 모르고서 클래스 라이브러리를 이해하는 것은 불가능하다. 클래스 라이브러리는 API 함수의 기반 위에서 만들어졌다.


3. 자유를 얻기 위해

비주얼 툴이나 클래스 라이브러리는 편리하지만, 프로그래머를 일정한 틀에 가두어버린다. 마치 제공되지 않는 기능은 불가능한 것처럼 생각되어버린다. 하지만 API 함수를 사용하면 운영체제에서 가능한 일은 무엇이든지 가능하게 된다.


4. 가장 자연스러운 학습 과정.

윈도우즈 API가 윈도우즈 프로그래밍에 기초이기 때문에, 프로그래머에게 중요한 것은 당장 무엇을 할 수 있는 능력이 아니라, 필요할 때 원하는 지식을 습득 할 수 있는 능력이다.




API의 변수 명명법


접두어 

원래 명칭

의미 

cb 

Count of Byte 

바이트의 수 

dw 

Double Word 

부호 없는 long 형 정수 

Handle 

윈도우 , 비트맵 , 파일등의 핸들 

sz 

Null Terminated 

NULL 종료 문자열 

ch

Character 

문자형

Array 

배열 

Word 

부호 없는 정수형 

Integer 

정수형 

p, lp 

Pointer , Long Pointer 

포인터형 

Bool 

논리형 


= 헝가리안 표기법이다. 


 데이터형

의미 

BYTE 

unsigned int 

CHAR 

char 

WORD 

unsigned short 

DWORD 

unsigned long 

LONG 

long과 동일 

BOOL 

정수형으로, TRUE , FALSE 값을 가진다. 둘은 define 정의된 1과 0이다. 




핸들에 대한 이해


핸들(handle)이란 어떤 대상에 붙여진 번호이며, 문법적으로는 32bit (또는 64bit)의 정수 값이다.


핸들의 특징은 이와 같다.

1. 정수 값이며, 대부분 32bit. 오로지 '구분' 을 위해서 사용되므로, '중복되지 않는'다. (정수형이 비교 / 대입 연산이 가장 빠르다.)

2. 운영체제가 발급하고 사용하는 쓰기만 한다. (사용자는 핸들 생성 불가능)

3. 같은 종류의 핸들은 절대 중복 되지 않는다.

4. 값을 가지겠지만 알 필요는 없다. 포인터의 주소를 알 필요가 없는 것과 같다.



비트 OR 연산자.


원하는 작업을 여러개 하기 위해서 비트 OR 연산을 사용하게 된다.


서로 비트의 위치가 다르기 때문에, 10은 A, 01은 B의 작업이라면, 11은 A,B 하는 식으로 인식할 수 있다. 따라서 DT_BOTTOM | DT_WORDBREAK 등이 성립하게 된다.


#define DT_TOP              0x00000000
#define DT_LEFT             0x00000000
#define DT_CENTER           0x00000001
#define DT_RIGHT            0x00000002
#define DT_VCENTER          0x00000004
#define DT_BOTTOM           0x00000008
#define DT_WORDBREAK        0x00000010
#define DT_SINGLELINE       0x00000020
#define DT_EXPANDTABS       0x00000040
#define DT_TABSTOP          0x00000080
#define DT_NOCLIP           0x00000100
#define DT_EXTERNALLEADING  0x00000200
#define DT_CALCRECT         0x00000400
#define DT_NOPREFIX         0x00000800
#define DT_INTERNAL         0x00001000

보면 각 내용의 비트의 자릿수가 다르다는 것을 알수 있다. (이 내용은 16진수이기 때문에 80과 100은 2배의 차이가 맞다.)

 

이렇게 설계하므로서 각 비트의 자릿수를 다르게 하여 5개의 각기 다른 명령을 내린다면, 내부적으로는 비트 11111 처럼 전달되고, 해당 위치의 비트를 확인하여 명령의 실행 여부를 적용하는 것이 가능하고, 함수를 실행시키기 위해서 많은 인수를 전달할 필요가 없어진다.



유니코드

유니코드는 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계이다.

유니코드를 지원하기 위해서는 기존의 char 타입이 아닌 유니코드 타입을 써야한다.

 

 C 타입

유니코드 타입 

char 

TCHAR 

char* 

LPSTR 

const char* 

LPCTSTR 

 

유니코드 타입의 실제 정의문은 '조건부 컴파일문'으로 되어있다.

#ifdef UNICODE

typedef wchar_t TCHAR;

#else

typedef char TCHAR;

#endif

 

 

TCHAR로 작성하면 유니코드 - > 비 유니코드로 바꾸고 싶을 경우에도 소스는 그대로 두고 컴파일만 다시하면 된다.

 

단 우리가 사용하던 문자열 함수들은 유니코드를 대상으로 한 것이 아니므로, 유니코드를 위해 지원하는 함수를 사용해야한다.

 

 

 C 표준 함수

유니코드 지원 함수 

strlen 

lstrlen 

strcpy 

lstrcpy

strcat

lstrcat

strcmp

lstrcmp

sprintf

wsprintf

 

 

TEXT 매크로는 TCHAR처럼, 유니코드 설정에 따라 문자열 타입을 변경한다.

TCHAR* str = TEXT("string"); 이런식으로 사용하면,

TEXT가 상황(유니코드 설정 여부)에 따라 다르게 대응한다.

유니코드 컴파일이면 유니코드 문자, 아닐 경우 ANSI의 일반 문자가 된다.

 

 

64비트 API

실행 환경에 따라 (16bit 운영체제에서 int는 2byte였었다.) 달라지는 데이터를 일정하게 유지하기 위해서는 아래와 같은 타입을 사용하면 된다.

 

INT32 , LONG32 , UINT32 , ULONG32

INT64 , LONG64 , UINT64 , ULONG64

 



'프로그래밍 > windows API' 카테고리의 다른 글

Alphablend / TransparentBlt / GradientFill / msimg32.lib  (0) 2015.04.23
GetKeyState / GetAsyncKeyState  (0) 2015.04.14
API 6장 정리  (0) 2015.04.13
API 5장 정리  (0) 2015.04.13
Windows API 2장 정리  (0) 2015.04.09
Windows API 1장 정리  (0) 2015.04.09
Posted by GENESIS8

댓글을 달아 주세요