Windows Confidential구식이 된 16비트 아이콘

Raymond Chen

2008년 2월호 Windows Confidential 칼럼에서 이야기한 것처럼 Windows®에서는 여러 기능이 사라집니다. 이러한 작업은 대개 인식할 수 없을 정도로 매우 천천히 대규모로 진행되며 기능이 완전히 사라질 때마다 제품 팀에서는 이를 조용히 축하하는 정도로만 끝냅니다. Windows Vista®에서 사라진 기능 중 하나는 32비트 코드에서 16비트 모듈(대개 16비트 EXE 및 16비트 DLL)에 저장된 아이콘에 액세스하는 기능입니다.

이 사실을 알고 흥분하기 전에 16비트 코드에서는 여전히 16비트 모듈에 저장된 아이콘을 아무 문제 없이 액세스할 수 있다는 점을 명심하십시오. 이러한 과정은 16비트 에뮬레이션 계층 내에서 모두 처리됩니다. 사라진 기능은 16비트 모듈에 저장된 아이콘을 32비트 코드에서 액세스하는 기능입니다. 더 구체적으로 설명하자면 ExtractIcon 함수 같은 32비트 아이콘 추출 함수에서 16비트 DLL의 아이콘을 로드하는 기능이 사라졌습니다.

16비트 모듈에서 아이콘을 추출하는 32비트 코드는 FindResource와 같은 고급 커널 함수를 사용하여 파일에서 아이콘을 찾지 않습니다. 대신, 이 코드는 16비트 모듈 헤더를 구문 분석하고 리소스 테이블을 찾은 후 리소스 테이블을 구문 분석하여 원하는 아이콘 리소스를 찾는 자체적인 미니 로더를 구현해야 합니다. 이러한 작업을 모두 수행한 후에만 32비트 코드에서 최종적으로 픽셀을 아이콘으로 변환할 수 있습니다.

  (더 크게 보려면 이미지를 클릭하십시오.)

상상할 수 있듯이 이 작업을 수행하는 코드는 매우 구식이며 오류가 발생하기 쉽습니다. 즉, 실수나 악의적인 의도로 손상될 수 있는 바이너리를 구문 분석할 때 오류가 발생할 가능성이 많습니다. 열기 및 공유 모드가 달라지면 그에 따라 네트워크 캐싱 효과가 달라지기 때문에 성능 팀에서는 네트워크 성능을 향상할 수 있도록 파일을 여는 방식을 변경해 줄 것을 요청하는 경우가 있습니다. 그리고, 안정성 팀에서는 메모리 매핑 파일을 사용하지 않는 방식으로 구문 분석 코드를 다시 작성하도록 요청할 수 있습니다. 결국 이러한 코드를 유지 관리하는 비용이 해당 코드가 제공하는 가치를 넘어서게 됩니다. 따라서 누가 계속 16비트 프로그램을 작성하겠습니까?

사용 중인 16비트 프로그램은 16비트 에뮬레이션 계층이 존재하는 한 계속 실행됩니다. 물론, 64비트 Windows Vista에는 16비트 에뮬레이션 계층이 없습니다. 그렇다고 이것이 Windows XP에서 후퇴된 버전은 아닙니다. 64비트 Windows XP에도 16비트 에뮬레이션 계층은 없으니까요. 즉, 더 나아진 것도, 더 나빠진 것도 없습니다.

Windows Vista에서는 32비트 프로그램에서 ExtractIcon을 실행하여 16비트 DLL의 아이콘을 가져오는 기능만 없어졌습니다. 시작 메뉴에 16비트 프로그램에 연결된 바로 가기가 있는 경우 Windows 탐색기가 더 이상 이 16비트 프로그램의 기본 EXE에서 아이콘을 추출할 수 없기 때문에 해당 바로 가기의 아이콘이 일반 프로그램 아이콘으로 나타납니다. 이외에 크게 잃는 것은 없습니다. 하지만 이 문제가 마음에 걸린다면 바로 가기 속성을 편집하여 다른 32비트 모듈의 아이콘을 지정할 수 있습니다.

이 상실된 기능 때문에 문제가 발생하는 것을 확인한 경우는 단 한 가지로, 특정 아이콘 편집 도구로 만든 아이콘 라이브러리에서 발생한 문제였습니다. 무슨 이유인지 모르겠지만 해당 프로그램은 아이콘을 기본적으로 16비트 DLL의 리소스로 저장합니다. 따라서 더 이상 32비트 코드에서 이러한 아이콘에 액세스할 수 없습니다. 물론, 이 문제를 해결하는 쉬운 방법은 해당 아이콘 라이브러리를 32비트 DLL의 리소스로 다시 저장하는 것입니다.

아직은 아닐 수 있겠지만 결국 누군가 16비트 DLL에서 모든 아이콘을 추출하여 해당 아이콘이 포함된 32비트 리소스 전용 DLL을 만드는 간단한 프로그램을 작성할 것입니다. 그렇게 되면 16비트 DLL에 있는 오래된 아이콘을 사용하는 사람들이 시작 메뉴의 바로 가기에 해당 아이콘을 계속 사용할 수 있게 될 것입니다. 하지만, 여러분이 그러한 프로그램을 작성해도 실제로 그것을 필요로 하는 사용자를 찾지 못할 것이라는 이야기를 할 수 밖에 없을 것 같네요. Windows 사용자 인터페이스 팀에 들어온 요청 중에서 그러한 프로그램을 요청한 경우는 단 한 번도 없었으니까요.

Raymond Chen은 자신의 웹 사이트 The Old New Thing에서 Windows의 역사와 Win32 프로그래밍에 대해 다루고 있으며 동명의 저서에서도 이에 대해 다루었습니다. 그는 닫힌 문은 멀리합니다.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..