'윈도우'에 해당되는 글 1건

  1. 2007.10.05 레이몬드 첸의 윈도우 개발 282 스토리


레이몬드 첸의 윈도우 개발 282 스토리

ETC. 2007. 10. 5. 14:03

윈도우용 소프트웨어 사용과 개발에 관한 ‘방법(how)’이 아닌 ‘이유(why)’를 밝힌 최초의 책!
이 책은 윈도우 진영 대표 블로거의 글을 모아놓은 ‘윈도우 개발 비하인드 스토리’이다!
이 책은 참고 서적이나 방대한 입문서가 아니라, 짤막하고 서로 독립적인 일련의 글을 통해 윈도우의 철학을 파악할 수 있도록, 교훈적이 방식이 아닌 대화적 접근 방법을 취하는 ‘생생한 역사서’와 같다. 따라서 독자들은 흥미(또는 기술적인 전문성)에 따라 자유롭게 각종 주제로 건너뛸 수 있다. 글들은 일반적인 주제로 그룹화되어 있으며, 단 깊이 있는 주제를 설명할 때는 순서대로 읽어야 할 때도 있다(그러나 이것도 하나의 장 내에 국한된다).

이 책의 주 독자층은 누구인가?
윈도우의 역사에 관심이 있으면서 기술을 이해하는 독자들이다. 이 책의 내용 중 절반 정도는 프로그래밍 지식을 필요로 하지 않는다. 그리고 나머지 절반은 독자가 소프트웨어 설계와 개발에 기초적인 지식이 있다고 가정한다. 그러나 특별한 전문성은 요구하지 않는다. 다만 윈도우 프로그래밍과 관련된 주제에서는 독자가 Win32 사용자 인터페이스 프로그래밍과 COM에 친숙하다고 가정한다.

이 책으로부터 무엇을 얻을 것인가?
주된 목표는 불합리한 설계로 보이는 것의 이면에 숨어 있는 철학과 원리를 터득하는 것이다. 또, 윈도우에서 무엇인가 수행할 수 없을 때는 충분한 이유가 있기 때문이라는 것을 이해하게 될 것이다. 그리고 윈도우가 과거 호환성을 유지하기 위해 수행해야 하는 많은 노력을 파악할 수 있을 것이다(그리고 왜 그렇게 하는 것이 중요한지에 대해서도).

우리는 다음과 같은 것들에 한번쯤 물음표를 찍어본 적이 있었을 것이다.
- 왜 윈도우는 지금처럼 작동할까?
- 왜 컴퓨터 끄기가 시작 메뉴에 있을까?
- 그리고 도대체 시작 버튼은 왜 그곳에 있을까?
- 어떻게 대화상자 루프로 들어갈 수 있을까?
- 왜 레지스트리 파일들은 ‘하이브(hives)’라고 불릴까?
- 왜 GetWindowText 함수는 이상하게 작동할까?

이러한 질문에 대해 베테랑 개발자의 비하인드 스토리를 전격 공개한다!
윈도우의 이상한 부분 중 많은 것들은 윈도우 개발과정의 이면을 들여다보면 쉽게 수긍할 수 있다. 이러한 것들을 이해하면 생산성은 높아지고, 좌절하는 일은 줄어들 것이다. 10년 이상 마이크로소프트의 윈도우 개발팀에서 일해 온 레이몬드 첸은 독자가 알고 싶어하는 ‘숨겨진 윈도우’를 공개할 것이다. 첸의 매력적인 문체, 깊은 통찰력, 그리고 사려 깊은 유머 감각은 그를 세계 최고 수준의 테크니컬 블로거로 만들었다. 이 책에서 그는 공개되지 않은 설명, 값진 기술적 충고, 그리고 윈도우에 생명을 부여하는 일화들을 들려주며, 이 대부분을 여러분 자신의 것으로 만들어준다.

이 책의 내용들 중 몇 가지는 다음과 같다.
- 효과적인 사용자 인터페이스와 자동판매기의 상관관계
- 창과 대화상자 관리에 대한 깊이 있는 이해
- 성능 최적화가 직관적이지 않은 이유
- COM 개체와 비주얼 C++ 컴파일러의 약점
- 과거 호환성에 관한 자세한 내용
- 윈도우는 무엇을 하며, 왜 하는가?
- 개발자가 모르는 윈도우 프로그램의 보안 구멍
- 공들여 만든 프로그램을 윈도우에서 보다 잘 실행되게 하는 팁

저자 블로그 : http://blogs.msdn.com/oldnewthing/

http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200708300006
 

Chapter 01 사용자 인터페이스 설계의 초기 진출 1
컴퓨터를 끄기 위해 왜 시작 버튼을 눌러야만 하는가? 2
왜 윈도우에는 ‘전문가 모드’가 없는가? 3
모든 대화상자에서 기본 응답은 ‘취소’이다 3
최선의 설정은 느끼지는 못하지만 존재하고, 예상대로 작동하는 것이다 6
우리의 탁월한 지성미를 증명하기 위해 당신이 답변할 수 없는 질문을 할 것이다 6
설치할 때 더 새로운 운영체제 파일을 유지하겠느냐고 왜 묻지 않는가? 7
기능에 관한 생각 9
옵션 비활성화시키며, 언제 제거할 것인가? 11
버튼이나 메뉴에 ‘...’를 언제 넣을 것인가? 12
자동판매기를 위한 사용자 인터페이스 설계 13
실내 도어 락을 위한 사용자 인터페이스 설계 14
윈도우 UI에서의 마스카라의 발전 15

Chapter 02 윈도우 95에 대한 몇 가지 추억 17
내 시간대는 왜 세계 지도에 표시되지 않는가? 18
윈도우 95는 메모리가 1GB를 넘을 때 왜 부팅할 수 없었나? 19
윈도우 95에는 왜 곰, 토끼, 아기돼지라는 함수가 있나? 20
BOZOSLIVEHERE와 TABTHETEXTOUTFORWIMPS가 무엇인가? 21
윈도우 95 특수 판의 상자에는 무엇이 있었나? 23
윈도우는 모든 사람에게 로르샤흐 검사를 실시한다 23
무술 로그온 그림 24
왜 정말 큰 사전은 좋지 않은가 25
윈도우 95의 시작 소리에 관한 고찰 26
정확성을 고려하지 않는다면 칼럼을 쓰기가 훨씬 쉽다 27
시스템 속성 페이지는 왜 메모리 크기를 반올림하는가? 27
하드 디스크 표시등은 왜 몇 초마다 깜박이는가? 28
더 빠른 syscall 트랩에 대한 검토 29
1바이트는 1달러이다 30
제품 지원 요청은 판매비용을 가중시킨다 30
트윅 UI가 윈도우 CD에 왜 포함되지 않는가? 31
xcopy로는 윈도우를 설치할 수 없다는 사실을 밝히다 32
에그헤드 소프트웨어 상점 전체를 사다 33
윈도우 파워 토이의 역사 34
윈도우는 최종 빌드 번호를 어떻게 선택했는가? 36
서비스 팩에서는 왜 빌드 번호를 증가시키지 않는가? 38

Chapter 03 GetWindowText의 비밀 이력 39
윈도우는 텍스트를 어떻게 다루는가 40
GetWindowText 들어가기 40
이 규칙들이 마음에 들지 않을 때는 어떻게 할 것인가? 41
어떤 차이가 있는지 예를 들 수 있는가? 42
GetWindowText를 위한 규칙은 왜 이렇게 이상한가? 43

Chapter 04 작업 표시줄과 알림 영역 45
왜 어떤 사람들은 작업 표시줄을 ‘트레이’라고 부를까? 46
작업 표시줄은 왜 기본적으로 화면 아래쪽에 위치하는가? 47
작업 표시줄의 시계는 왜 초를 표시하지 않는가? 48
작업 표시줄은 왜 아날로그 시계를 표시하지 않는가? 49
작업 표시줄을 수직으로 고정시키면 왜 ‘시작’이 나타나지 않는가? 49
사용자가 ‘X’ 버튼을 클릭할 때 알림 아이콘은 왜 메시지를 받지 않는가? 50

Chapter 05 헷갈리는 인터페이스 문제 51
이 작은 중첩 아이콘들은 무엇인가? 52
로그 온할 때 원하지 않는 파일이나 폴더가 왜 열리는가? 52
파일 라벨 색상은 무엇을 의미하는가? 55
고급 옵션 대화상자는 왜 각 옵션에 ON 또는 OFF를 표시하는가? 56
Alt+Tab 목록에 나타나는 아이콘 순서는 어떻게 결정되는가? 56
폴더의 읽기전용 속성은 왜 그렇게 이상한가? 57
작업 표시줄의 빈 버튼을 클릭하면 왜 사라지는가? 58
모두 최소화와 바탕화면 보기의 차이점은 무엇인가? 59
메뉴의 굵은 활자는 무엇을 의미하는가? 60
개인화된 웹 사이트 아이콘들은 어디서 오는가? 60
작업 관리자의 탭과 버튼들은 어디로 갔나? 61
파일을 드래그하면 이동이 될까, 복사가 될까? 62
연결 폴더는 왜 자동으로 재생성되는가? 63
문서를 여러 개 선택하고 인쇄할 때 순서가 왜 바뀌는가? 64
레이몬드, 제품 지원으로 하루를 보내다 65
커넥터에 먼지 불기 65
윈도우에서 기가바이트는 정확히 얼마 만큼인가? 67
‘테스트/검토 목적으로만 사용’이라는 꼬리표를 왜 제거할 수 없는가? 67

Chapter 06 GlobalAlloc 함수의 이력 69
초창기 70
선택자 72
Win32로의 전이 73
구현에 대한 간단한 언급 74

Chapter 07 Windows 프로그래밍의 짤막한 주제들 77
임시용 프로그램 78
제목 아이콘을 위한 오른쪽 클릭 상황 메뉴 만들기 83
CreateMenu와 CreatePopupMenu의 차이점은 무엇인가? 85
창 관리자는 메뉴들을 언제 자동으로 제거하는가? 87
창이 화면에 보일 때만 그리기 87
창이 덮였는지 판단하기 91
바둑판식 배열 효과를 위한 비트맵 브러시 93
DC 브러시는 언제 쓸모가 있는가? 96
고정된 직사각형을 그리는 데 ExtTextOut 사용하기 98
고정된 직사각형을 그리는 데 StretchBlt 사용하기 100
흉측한 상자 없이 문자열 출력하기 101
세마포어는 소유자가 없다 109
자동 리셋 이벤트는 단지 어리석은 세마포어일 뿐이다 111

Chapter 08 창 관리 113
왜 가짜 WM_MOUSEMOVE 메시지를 받는가? 114
WM_MOUSEENTER 메시지 는 왜 없는가? 116
흰 플래시 117
빈 브러시의 용도는? 117
바탕화면 창은 무엇이 그렇게 특별한가? 118
창을 비활성화하고 활성화하는 올바른 순서 119
이전 창 위치를 복원할 때의 미묘함 120
UI 모달성과 코드 모달성 121
WM_QUIT 메시지와 모달성 124
모달 UI의 올바른 소유자 설정의 중요성 127
모달이 된 프로그램과 상호작용하기 130
시한 MessageBox - 간단한 버전 130
임시용 창 133
GWLP_USERDATA의 보너스 창 바이트들 134
시한 MessageBox - 더 나은 버전 134
시한 상황 메뉴 137
왜 창은 파괴된 후에 메시지를 받는가? 138

Chapter 09 하드웨어에 대한 회고담 139
하드웨어 과거 호환성 140
유령 CD-ROM 드라이브 141
마이크로소프트 회사 네트워크는 지옥보다 1.7배 나쁘다 141
제조업체가 그들 자신을 모욕할 때 143
WHQL 드라이버 인증 절차 속이기 143
6미터짜리 컴퓨터 144
죽음의 USB 카트 145
새 장치가 인식되었습니다 - 보잉 747 145
엄청나게 많은 오버클로킹이 있었다 146

Chapter 10 대화상자 관리자의 내부 처리 149
대화상자 프로시저에 대해 150
대화상자 템플릿의 발전 161
도대체 대화상자 템플릿은 왜 사용하는가? 195
대화상자는 어떻게 생성되는가 197
모달 대화상자 루프 205
중첩 대화상자와 DS_CONTROL 217
도대체 왜 대화상자 루프가 필요한가? 225
대화상자 편집기는 왜 컨트롤 ID를 100부터 할당하기 시작하는가? 226
DefDlgProc 안에서 어떤 일이 벌어지는가? 227
비활성화된 컨트롤로부터 초점을 이동시키지 말 것 229
IsDialogMessage 안에서 어떤 일이 벌어지는가? 230
메시지 상자의 X 버튼은 왜 비활성화되는가? 237

Chapter 11 일반적인 소프트웨어 문제 239
일광 절약 시간제는 왜 직관적이지 않은가 240
파일을 플로피에 복사할 때 타임스탬프가 왜 바뀌는가? 241
반환 주소를 믿지 말라 242
정렬 비교 함수 작성하기 243
다른 편에서 계약서를 읽을 수 있다 245
실용주의와 순수주의 사이의 전쟁 249
최적화는 종종 직관에 반한다 250
서버에서 페이징 = 죽음 253
재계산할 수 있는 것은 저장하지 말라 254
성능은 다른 구성요소의 희생으로 얻어진다 255
폴링에 대한 성능적 결과 257
메모리 누수를 식별하기 위한 가난한 사람의 방법 258
나쁜 정책을 가진 캐시는 메모리 누수의 또 다른 이름이다 259

Chapter 12 비주얼 C++ 컴파일러에 대한 집중 탐구 267
소멸자가 언제 실행되는지 아는가? 268
COM 개체의 레이아웃 272
조정자 썽크 275
__purecall은 무엇인가? 280

Chapter 13 과거 호환성 283
종종 애플리케이션은 단지 중단시키기를 원한다 284
프로그램이 문서화되지 않은 구조에 굴복할 때 284
문서화되지 않은 특성에 의존하는 애플리케이션들을 왜 단순히 차단하지 않는가? 286
16비트 DOS와 윈도우는 왜 아직도 존재하는가 288
NUL이나 CON과 같은 예약 파일명에 대한 정책은 무엇인가? 290
UNC 경로의 앞에 (가끔) 왜 드라이브 문자가 허용되는가? 292
게임 디어 헌터의 위력을 과소평가하지 말라 293
버그는 종종 게임의 후반까지 드러나지 않는다 293
셸 폴더 키에 관한 길고 슬픈 이야기 294
오류 코드 과거 호환성의 중요성 296
그럼요, 할 수 있어요 297
프로그램이 운영체제를 패치하고 손상시킬 때 299
호환성은 내부의 부수적인 작업에까지 제약을 가한다 300
윈도우는 왜 BIOS 시계를 지역 시간으로 유지하는가? 301
잘못된 버전 번호 확인 302
사람들이 IUnknown::QueryInterface를 망치는 방법 302
시스템이 결코 바뀌지 않을 것이라고 프로그램이 가정할 때 - 에피소드 1 304
시스템이 결코 바뀌지 않을 것이라고 프로그램이 가정할 때 - 에피소드 2 305
위장 디스플레이 제어판 306
위장 시각 스타일 307

Chapter 14 어원과 역사 309
WPARAM과 LPARAM의 W와 L은 무엇을 나타내는가? 310
윈도우 98에서 최대 모니터 개수는 왜 9개였는가? 310
레지스트리 파일은 왜 하이브라고 불리는가? 311
16비트 윈도우 내의 자원을 위한 메모리 관리 311
HINSTANCE와 HMODULE의 차이점은 무엇인가? 312
WinMain의 hPrevInstance 매개변수의 목적은 무엇인가? 314
GlobalWire 함수는 왜 그렇게 불리는가? 316
LocalAlloc과 GlobalAlloc의 차이점은 무엇인가? 316
GMEM_SHARE 플래그의 요점은 무엇인가? 318
LPARAM으로 캐스트하기 전에 왜 중복된 캐스트를 종종 보게 되는가? 319
왜 레지스트리 함수 이름은 가끔씩 Ex로 끝나는가? 320
SHGetMalloc, SHAlloc, CoGetMalloc, CoTaskMemAlloc 사이의 차이점은 무엇인가? 322
윈도우 오류 보고는 왜 닥터 왓슨이란 별명을 가지는가? 327
다이렉트엑스 4에 무슨 일이 있었나? 328
HANDLE 반환 값은 왜 그렇게 일관성이 없는가? 329
텍스트 파일은 왜 Ctrl+Z로 끝나는가? 331
행 종결자는 왜 CR+LF인가? 332
TEXT와 _TEXT와 _T, 그리고 UNICODE와 _UNICODE 333
대화상자는 왜 처음에 숨긴 채 만들어지는가? 333
내부를 바꾸면 아무도 눈치 채지 못한다 334
FlushInstructionCache가 아무 것도 하지 않는데 왜 호출해야 하는가? 335
InterlockedIncrement/Decrement는 왜 결과의 부호만 반환하는가? 336
WSASetLastError 함수는 왜 존재하는가? 337
윈도우에는 왜 방송 기반의 메커니즘이 있는가? 338
작업 표시줄이 만들어지기 전에는 창들이 어디로 최소화되었나? 339
바탕화면 창은 왜 작업 표시줄을 제외하도록 축소되지 않았는가? 340
Alt 키를 눌렀다 놓을 때 캐럿은 왜 깜박임을 멈추는가? 341
ES_OEMCONVERT 플래그는 무엇인가? 342
파일 시스템 터널링의 배경 역사 343
NTFS와 탐색기는 왜 파일명 정렬에서 일치하지 않는가? 345
날짜 및 시간 제어판은 달력이 아니다 347
윈도우 95는 어떻게 DLL의 기본 주소를 변경했나? 348
SYSTEM_FONT와 DEFAULT_GUI_FONT는 무엇인가? 350
상하 컨트롤의 화살표들은 왜 거꾸로 되어 있는가? 351
윈도우 95 발표회 입장권 352

Chapter 15 창 메시지는 어떻게 전달되고 추출되는가 355
전송 메시지와 게시된 메시지 356
전송 메시지의 수명 361
게시 메시지의 수명 362
생성된 게시 메시지 363
SendMessageCallback은 언제 여러분을 다시 호출하는가? 366
메시지가 시간제한이 될 때 SendMessageTimeout에서 어떤 일이 벌어지는가? 367
여러분이 배운 것을 몇 가지 메시지 처리 신화에 적용하기 367
누가 메시지를 전송 또는 게시했는지 어떻게 알 수 있는가? 368
PostMessage로 키보드 입력을 흉내낼 수 없다 369

Chapter 16 국제적 프로그래밍 371
유니코드에서 대소문자 매핑은 어렵다 372
부적절한 대소문자 매핑에 관한 일화 373
왜 텍스트를 회전시킬 수 없는가 374
0409와 1033이라고 불리는 디렉토리들은 무엇인가? 376
코드 페이지를 계속 주시하라 377
기본 8비트 코드 페이지는 왜 ‘ANSI’라고 불리는가? 386
기본 콘솔 코드 페이지는 왜 ‘OEM’이라고 불리는가? 386
OEM 코드 페이지는 왜 종종 ANSI라고 불리는가? 387
유니코드와 ANSI 사이의 변환에 대한, 논리적이지만 다소 놀라운 결과 388

Chapter 17 보안 391
모든 사람이 쓸 수 있는 파일 392
탐색기로부터 파일 감추기 393
패스워드 훔치기 394
비인증 드라이버의 조용한 설치 395
디버깅 코드가 보안 취약점이 될 수 있다 396
공유 영역은 왜 보안 취약점인가 397
인터넷 익스플로러의 고급 보안 구성은 인트라넷을 신뢰하지 않는다 400

Chapter 18 Windows 2000과 Windows XP 403
새 시작 메뉴는 모든 프로그램 목록에서 왜 즐겨쓰는 메뉴를 사용하지 않는가? 404
시작 메뉴 고정 목록에는 왜 프로그램으로 액세스할 수 없는가 405
윈도우 XP 서비스 팩 2는 왜 종종 CD 자동실행 설정을 잊어버리는가? 406
안전하지 않은 장치 제거 대화상자 407
윈도우 XP의 코멘트? 버튼에 대한 두 가지 회고담 408
CD를 구운 후에 탐색기는 왜 그것을 꺼내는가? 409
윈도우를 설치할 때 왜 새 부트 섹터를 저장하는가? 409
심적인 디버깅 : 왜 값비싼 4 CPU 컴퓨터에서 세 개를 무시하는가 410
심적인 디버깅 : CPU 사용량이 왜 50%로 올라가는가 411
DS_SHELLFONT 플래그는 무엇인가? 412
왜 DS_SHELLFONT = DS_FIXEDSYS | DS_SETFONT인가? 413
DS_SHELLFONT는 속성 시트 페이지에서 어떤 다른 효과를 가지는가? 414

Chapter 19 Win32 설계 문제 417
가져오기가 해결되지 않으면 왜 Win32의 모듈을 로드할 수 없는가? 418
왜 구조체의 크기는 엄격하게 점검되는가? 419
WM_DEVICECHANGE를 위해서 왜 이런 이상한 값을 반환해야 하는가? 422
프로그램과 사용자 간의 무기 경쟁 423
TerminateProcess는 왜 가로채지 못하는가? 424
어떤 프로세스는 죽고 난 후에 왜 작업 관리자에 남아있는가? 425
WAIT_ABANDONED의 결과 이해하기 426
알림 아이콘 풍선 팁 내 하이퍼링크를 넣을 수 없는가? 428
같은 트리 항목 여러 번 사용할 수 없는가? 429
괴상한 STRRET 구조체 430
UTF-8을 왜 ANSI 코드 페이지로 설정할 수 없는가? 431
가라앉은 클라이언트 영역은 언제 사용해야 하는가? 432
모두 포함하는 윈도우 상위 집합 버전이 왜 없는가? 433
바탕화면을 비활성화하는 것이 어떻게 가능하단 말인가? 434
창과 메뉴의 중첩 한계는 무엇인가? 435
HWND_TOP과 HWND_TOPMOST 사이의 차이점은 무엇인가? 435

Chapter 20 부담 437
계층적 저장소 관리 438
지정학 439
원격 데스크톱 연결과 그리기 440
빠른 사용자 전환과 터미널 서비스 443
다중 사용자 444
로밍 사용자 프로필 445
전환된 폴더 447
내 문서와 Application Data 450
대규모 주소 공간 451
전원 관리와 배터리 전원 감지하기 455
간헐적인 네트워크 연결 457
안티 앨리어스 글꼴과 클리어타입 459
고해상도 디스플레이 462
다중 모니터 466
작업 영역 469
팝업 창을 정확한 장소에 표시하기 470
접근성 471

Chapter 21 어리석은 짓 481
많이 오해되는 ‘없는(nop)’행동 481
마케팅이 슬라이드를 망치지 못하게 하라 482
별난 버그 보고서 482
예제 URL을 조심하라 483
독립된 코드는 없다 484
그러나 나는 비주얼 베이직 프로페셔널을 가지고 있다 485
이는 모두 반투명의 플라스틱 때문이다 485
필자의 첫 번째 살해 위협 486
AOL CD로부터 벗어날 수 없다 487
컴퓨터를 전원에 연결하기 전에 충분한 경고 주기 488
스파이더 솔리테르가 인기 있는 챔피언을 내쫓다 489
랫 포커에는 무엇인가가 있다 489
제품 그룹의 이름을 지을 때 조심하라 490
내부 배포 목록 이름을 부여할 때의 심리학 491
관리자와 프로그래머 사이의 차이점 491
플로피 디스크를 세마포어 토큰으로 사용하기 492
토큰이 중간에 의미를 바꿀 때 493
부드러운 형태의 질책인 별난 골칫거리 494
물리적 개체를 상기자로 사용하기 494
사무실 디스코 파티 495
할로윈 주제의 로비 496

인덱스 497


: