옛날에 본인은 윈도우 운영체제의 도움말 시스템에 대해서 심층 분석을 하는 글을 쓴 적이 있다. 그때 그 글은 윈도우 3.0 시절부터 XP까지 존속했던 HLP, 즉 과거의 WinHelp 기반 도움말을 주로 다뤘다. 그래서 이번에는 WinHelp를 대체하는 새로운 도움말 시스템인 HTML 도움말의 기술적 디테일에 대해서 보충 설명을 좀 하겠다.
HTML 도움말 파일의 확장자는 CHM이다. 예전 글에도 언급돼 있듯, HTML 도움말은 웹브라우저의 렌더링 엔진을 도움말에도 그대로 재활용하자는 발칙한 발상을 토대로, 인터넷 익스플로러 4 시절에 첫 도입되었다.
HTML 도움말과 관련된 모든 구동과 조작은 도움말 SDK에 스펙이 명시되어 있는 HtmlHelp 함수 하나로 다 가능하다. 함수의 디자인은 여러 모로 종래의 WinHelp와 유사한 구조로 되어 있다. 다만, WinHelp가 운영체제의 user32.dll에 직통으로 당당히 등재된 함수인 것에 비해 HtmlHelp는 메커니즘이 약간 복잡하다.
HtmlHelp.lib는 다른 dll에 대한 import용 껍데기 라이브러리가 아니다. HTML 도움말 ActiveX 컨트롤 컴포넌트인 hhctrl.ocx 파일로부터 진짜배기 HtmlHelp 함수를 수동으로 LoadLibrary/GetProcAddress하여 호출하는 코드가 안에 들어있으며, 링크 시에 그 코드가 들어가게 된다. 따라서 HtmlHelp 함수를 호출한다고 해서 뭔가 생소한 DLL에 대한 직접적인 의존도가 추가되지는 않는다.
과거에 HLP 파일을 생성해 주는 도움말 컴파일러가 있었듯, 마이크로소프트에서는 CHM 파일을 생성해 주는 도움말 컴파일러도 만들었다. 이름하여 HTML Help Workshop. MS 홈페이지에서 무료로 구할 수 있다.
이 프로그램에는 HTML Help Image Editor라고, 기능이 아주 빈약한 간단한 그래픽 에디터도 포함되어 있다. 그런데 이게 내가 보기에 좀 특이한 프로그램이다. 일단, MS 내부에서 개발한 프로그램 중에서 MFC를 사용하여 만들어진 극소수 프로그램 중 하나이며... (헐) 드로잉 기능조차 하나 없이 화면 캡처, 이미지 자르기, 디더링, 복붙 편집이 전부인 초간단 그래픽 에디터의 실행 파일 크기가 무려 750KB에 달한다. JPG/PNG 파일을 읽고 쓰는 코드가 들어있기라도 한 것도 아니다(그런 건 외부 필터 DLL이 따로 담당).
이게 무슨 델파이로 만든 프로그램도 아니고, 게다가 MFC를 static이 아닌 DLL로 링크했음에도 불구하고 기능에 비해 수긍이 어려운 크기인지라 실행 파일 내부를 들여다봤는데, 그냥 BMP로 때려박아 넣은 리소스 이미지 때문에 크기가 커진 것 같다.;;
이 프로그램의 진짜 특이한 면모는 도움말 창이 뜨는 모습이다. 도킹 윈도우처럼 생긴 보조 윈도우 밑에, HTML 도움말 윈도우가 child 윈도우로 떠 있다. 시스템 메뉴와 캡션, 최소/최대화 버튼까지 있는 당당한 독립 윈도우가 무슨 MDI child 윈도우처럼 다른 윈도우 내부에 이상하게 끼여 있는 게 심히 기괴하다. 저런 식으로 윈도우가 떠 있는 프로그램은 난 지금까지 저 프로그램밖에 못 봤다.

오늘날은 잘 알다시피 HLP 도움말이 사라지고 없기 때문에, 운영체제가 기존 WinHelp 함수에다 HtmlHelp 함수의 기능을 그냥 그대로 집어넣어 버려도 될 것 같다는 생각이 든다. 파일 매체만 다를 뿐이지 하는 일은 거의 똑같으니까.
그런데 문제는 HLP에 이어서 CHM도 MS가 이제 더 지원이나 개발을 하지 않는다는 점이다. <날개셋> 한글 입력기를 포함해 CHM 도움말을 사용하는 아무 프로그램이나 띄워서 도움말을 꺼내 보기 바란다. 윈도우 7에 이르기까지 도움말 창의 도구모음줄 아이콘은 10년 전의 16색 그대로이다. -_-;; HTML 도움말은 UTF8 인코딩 본문 검색도 지원하지 않는다.
HTML Help Workshop은 1997년에 첫 개발된 뒤 실질적인 개발은 1999년에 끝났고, 2002년인가 2003년에 여전히 1.x 마이너 업그레이드를 끝으로 버전업이 중단됐다. 물론 MS는 도움말 컨텐츠를 HTML로 표시하는 건 변함없다. 하지만 이제 CHM 파일을 사용하지는 않는다.
정통으로 자기네 도움말 표시에 HtmlHelp API + CHM 파일을 썼던 건 운영체제는 98과 2000이 전부이고, 오피스 프로그램은 내 기억이 맞다면 2000/XP/2003이 끝이다. 그 뒤엔 또 자기네들만의 독자적인 도움말 시스템을 중복 개발해서 쓴다.
HLP만 보안 위협이 있는 게 아니라 CHM도 웹이 다이나믹한 요소 때문에 위험한 것만큼이나 보안 위협이 많기 때문에, 오히려 CHM의 권한은 약화돼 왔다. 그래서 윈도우 XP의 모 보안 업데이트(아마 SP1 시절인 듯)가 적용된 뒤부터는, 인터넷에서 다운로드한 CHM 파일은 내용이 곧장 표시되지 않게 되었다. 속성을 열어서 파일이 안전하다는 플래그를 수동으로 설정한 뒤에야 내용을 볼 수 있다.
HTML 도움말은 웹브라우저와 붙어 있는 컴포넌트인 만큼, 윈도우 운영체제가 먼 미래에 CHM마저 과거의 HLP처럼 지원을 아예 중단해 버릴 가능성은 내가 보기에 희박하다. 하지만 요즘은 도움말 자체가 그냥 개발사 홈페이지를 통한 온라인 도움말로 대체되는 추세여서 오프라인 도움말 관련 기술의 입지가 좁아져 있는 것도 사실이다. 난 개인적으로는, 웹 에디터만으로 도움말을 간편하게 만들 수 있게 해 준 HTML 도움말을 무척 유용하게 잘 활용하고 있는데 MS가 지나치게 이걸 홀대하고 있다고 생각한다.
그나저나 말이 나왔으니 말인데, 윈도우 프로그래밍을 15년 가까이 했음에도 불구하고, 본인은 아직도 overlapped window와 popup window의 개념적인 차이를 잘 모르겠다. -_-;;
옛날에 윈도우 1.0은 애플 사와의 특허 문제 때문에 모든 프로그램 창들이 벽지 타일처럼 안 겹치게 다닥다닥 배열되는 엽기적인 모습으로 출시됐었기 때문에, 그 당시엔 겹침 가능한 윈도우(overlapped)가 별도의 스타일로 표현되는 특징이었다. 그리고 대화상자처럼 진짜 팝업 형태로 뜨는 윈도우(popup)도 별도의 스타일로 표현되긴 했었는데, 지금은 아마 별 의미가 없는 자질이지 싶다.
Posted by 사무엘

