괴짜 프로그래머의 일상사~@@
프로그래밍, 컴퓨터, 그리고 일상에 관한 소소한 이야기들...
Blog | Guestbook
Keyword | Local | Tag
T 112 / Y 700 / Total 3405170
Catergories
Calendar
«   2007/08   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Tag
증가, X맨, 누나, 코드구루, 맘마미아, without you, 만인드맵, OS, 블로그링크, 네트워크, The Old New Thing, 애쉬튼 커처, 잠재의식, HEAL THE WORLD, IME, KeyTweak, 우리들의 행복한 시간, 아인슈타이, 애니메이션, 디지로그,
Archive
Link
Search
  submit
Recent Articles
Recent Comments
Recent Trackbacks
해당되는 게시물 2건
2007/08/25 12:13
윈도우 타입 시스템

[GGG]
처음으로 C언어를 익히고 Windows 프로그래밍을 하는 사람들이 겪는 가장 큰 어려움은 복잡한 타입 시스템이다. 대부분의 사람들이 PVOID, LPCTSTR, TCHAR, LPTSTR등으로 전혀 듣지도 못했던 타입 명들 앞에서 당황한다.

하지만 이렇게 괴상하게 보이는 것도 다 몇 가지 기본적인 규칙에 의거해서 만들어져 있기 때문에 그러한 규칙들을 알게 된다면 누구나 쉽게 이해할 수 있고 편하게 사용할 수 있다. 그 규칙이란 것도 특별한 것이 아닌 글자를 통한 축약 형태이다. 여기서는 자주 등장하는 글자들이 의미하는 바를 살펴보고 그것들이 실제로 자주 사용되는 타입 명에서 어떻게 적용되는지 알아보도록 하자. 

글자

의미

T

문자를 나타내는 타입에 주로 등장하는 글자다. T가 의미하는 바는 유니코드와 ANSI의 컴파일 환경에 따라 적절히 변경된다는 것을 나타낸다. 유니코드 빌드라면 wchar_t로 변환되고, ANSI 빌드라면 char로 변환됨을 나타낸다.

L

long을 나타낸다. 주로 포인터 타입에 많이 등장한다. 16비트 시절은 포인터가 near, far등으로 구분해서 사용했다. 그 시절 관습에 따라 붙여진 것이다. 32비트 환경에서는 그러한 포인터 사이에 구분이 없기 때문이 L이 붙은 것과 붙지 않은 것 모두 같은 의미를 가진다.

C

const를 나타낸다. C가 들어간 자료형은 값을 수정할 수 없는 const로 선언된 것이라 이해하면 된다.

D

double을 나타낸다. 크기가 두 배라는 의미다.

U

unsigned를 나타낸다.

H

핸들을 나타낸다. 대부분 이 타입은 void *로 변환된다.

그럼 이제 자주 사용되는 타입을 살펴보자. 

타입 명

설명

TCHAR

char형을 표현하는 타입이다. T가 붙었기 때문에 유니코드에선 wchar_t, ANSI에서는 char로 변환된다.

PTSTR,

LPSTR

문자열에 대한 포인터를 나타낸다. 유니코드에선 wchar_t *, ANSI에서는 char *로 변환된다.

PCTSTR,

LPCTSTR

수정이 불가능한 문자열 포인터를 나타낸다. 유니코드에선 const wchar_t *, ANSI에서는 const char *로 변환된다.

PVOID

void 포인터를 나타낸다. void *로 변환된다.

PCVOID

상수 void 포인터를 나타낸다. const void *로 변환된다.

BOOL

TRUE/FALSE를 나타내는데 사용됨을 의미한다. 실제로는 int로 변환된다.

BYTE

8비트 무부호 정수를 나타낸다. unsigned char로 변환된다.

WORD

16비트 무부호 정수를 나타낸다. unsigned short로 변환된다.

DWORD

32비트 무부호 정수를 나타낸다. unsigned long으로 변환된다.

UINT

unsigned int로 변환된다.

USHORT

unsigned short로 변환된다.

ULONG

unsigned long으로 변환된다.

PWORD,

LPWORD,

PUSHORT,

LPUSHORT

unsigned short * 변환된다.

HANDLE

파일, 뮤텍스, 세마포어, 이벤트등의 핸들을 나타낸다. void *로 변환된다.

HPEN

GDI PEN 핸들이다. void *로 변환된다.

HBITMAP

GDI BITMAP 핸들이다. void *로 변환된다.

보다 많은 타입에 대한 더욱 상세한 설명은 아래 페이지에 나와있다.
http://msdn2.microsoft.com/en-us/library/aa505945.aspx

2007/08/25 03:48
비트필드, 엔디안, MP3 프레임 헤더
[GGG]
얼마전 소리통을 만들고 거기에 음악방송 기능을 추가하면 좋겠다는 생각이 들었습니다. 그래서 ShoutCAST 소스 필터를 찾아보았는데 찾기가 쉽지 않더군요. 물론 코덱팩에 들어있는 필터는 많은데 저는 별도의 코덱을 설치하지 않아도 들을 수 있게 하고 싶었습니다. 그냥 exe에 집어넣을 수 있게 소스가 있으면 좋겠다 싶었죠.

네트를 방황하던 끝에 ShoutCAST 소스 필터를 찾을 수 있었습니다. MPEG-1 Stream Splitter 필터에 연결해서 사용할 수 있는 소스 필터였습니다. 필터 소스를 분리해서 연결하니 음악 방송이 솔솔 흘러오더군요. 음. 다했네 라고 잠시 생각했습니다. 그런데 헉.. 아주 사소한 문제가 있었습니다. 바로 탐색이죠. 로컬 파일 같은 경우는 앞뒤로 이동이 되는데 음악 방송같은 경우는 원칙적으로 탐색이 불가능합니다. 그런데 이 놈은 MPEG-1 Stream Splitter에 연결해서 쓰는 놈이라 그런지 탐색이 되는 것이었죠. 탐색이 되는건 아니고 단지 되는 척만 하는 것이었죠. 물론 UI에서 체크해서 비활성화 시키면 되지만 비겁한 방법이란 생각이 들더군요.

그래서 MP3를 분석해서 직접 ShoutCAST 푸시 소스 필터를 만들어야 겠다고 생각을 했습니다. MP3 프레임 헤더는 정말 간단한 4바이트 구조로 이루어져 있습니다. 프레임 헤더 구조가 궁금하신 분은 다음 페이지를 참고하세요. http://www.dv.co.yu/mpgscript/mpeghdr.htm

4바이트 심플한데 비트가 홀수로 쪼개져서 조금 귀찮아 보이죠. 전 저걸 보고 겁없이 비트필드를 만들었답니다. 보는 순간 이건 나에게 비트필드를 만드라고 지시하는 것 같았죠. 그 날 전 하루 죈장 삽질했습니다. 제가 삽질했던 이유는 비트필드의 메모리 레이아웃을 제대로 몰랐고, 엔디안을 정확하게 판단하지 않았던 것 입니다. 파일에 저장된 4바이트는 빅엔디안 순서로 저장되어 있고, VC++의 비트필드는 리틀 엔디안과 같이 뒤에서 부터 비트를 채우는 형태더군요(http://msdn2.microsoft.com/en-us/library/ms858673.aspx 참고). 결국 작업을 하긴 했지만 굉장히 힘든 과정이었습니다. 단지 4바이트 분석하는것이. ㅠㅠ

아래는 비트필드에 관한 자료를 찾던 중 발견한 재미난 내용입니다.

첫 번째 링크는 뉴스그룹에서 비트필드에 관한 논쟁입니다.
베커 아저씨와 mlimber 아저씨의 논쟁인데 둘의 입장이 첨예하게 대립됩니다.
mlimber 아저씨는 비트필드 따위를 버려라.
임플멘테이션 디펜던트하기 때문에 플랫폼이 바뀌면 쪼다된다.
비트스트림을 추상화한 클래스를 사용해라. 라는게 주된 주장입니다.
베커 아저씨는 좀 더 현실적인데요.
비트필드가 어울리는데는 그걸 사용하는게 옳다.
사실 템플릿메타 프로그래밍으로 비트 스트림 클래스를 만드는 것보다,
다른 플랫폼에서는 거기 알맞은 비트필드로 고쳐주는 것이 옳다. 라는게 주장입니다.
두 번째 링크는 mlimber 아저씨가 참고하라고 올려준 비트 스트림 클래스입니다.
자세히 읽지는 않았지만 재미난 내용인 것 같아요.

뉴스 그룹 스레드
비트필드를 예술로 승화시킨 사나이

재미난 논쟁인데 여러분은 어떤 입장인가요? 이번달 마소 플러스에도 이와 관련된 내용을 하나 연재했는데, 저는 베커 아저씨한테 손을 들어주고 싶습니다. 왜냐하면 일반적으로 회사에서 개발하는 제품은 특정 플랫폼에서 동작하는 경우가 대부분이기 때문이죠. 멀티플랫폼을 생각하더라도 베커 아저씨 말처럼 비트필드를 스왑하는 작업은 그다지 큰 힘도 어려운 일도 아닙니다. 과거 수많은 소프트웨어들이 그런 식으로 포팅되어 왔구요. 물론 잘 만들어진 비트스트림 클래스가 있다면 사용하는 것이 바람직하겠지만 없는걸 굳이 만들어가면서 까지 시간을 소비할 필요는 없을것 같다는게 제 생각입니다. 또한 템플릿 메타 프로그래밍을 해본 사람이라면 알겠지만 쉬이 접근할 곳이 아니죠.

---
한참 전에 썼던 글인데 아직도 ShoutCAST 푸시 소스 필터는 만들지 못했습니다. 요즘은 회사일이 조금 바빠서 그 코드 보는 일만으로도 힘이 드는군요. 저런건 또 재미 붙었을때 만들어야 하는데 타이밍 놓치면 다시 만들라면 좀 그렇더라고요. 하지만 언젠가는 ShoutCAST 기능을 붙일 겁니다. *^^* 언젠가는 다시 재밌어 지겠죠. ~~

 Prev   1   Next 
codewiz’s Blog is powered by Tattertools.com / Designed by faido