[Book] プログラミング関連書籍のご紹介―Win32 API/COM/.NET Framework 編 (ja)

今回はMicrosoftのWin32 API、COMテクノロジー、.NET Frameworkに関する参考書をご紹介します。

1. Win32 API
Windowsプログラミングの参考書としてまず外せないのが、Charles Petzoldの「プログラミングWindows」シリーズでしょう。本シリーズはWindowsの黎明期からプログラマーとして活躍している著者が最初のプログラミングガイドとして上梓し、Windowsプログラミングの集大成として(主にメジャーバージョンアップのタイミングで)改訂し続けてきたものです。特にWindows初期において、プログラミングに関する質問事項に対する最終的な答えが「Petzoldを見ろ!」であったことは有名であり、それだけ本書の解説書として、またリファレンスとしての評価の高さがうかがえます。筆者の書棚には「プログラミングWindows95」がいまだに現役のリファレンスとして鎮座していますが、最新の動向に合わせて内容も大きく変わってきています。
「プログラミングWindows95」は、国内でWindows95が発売された後半年~1年ほど経ってから出版されたもので、シリーズでは初めてのWin32 APIを取り扱った版となります。この時点ではサンプルプログラムの大半はC言語とMakefileとWin32 SDKツールを用いて解説するという、とても硬派な内容でした(当時普及し始めたVisual C++ 4.0での開発もちょっとした工夫で実現できます)。それまでの版から継承しているWindows APIの基本的な使い方から思わぬ落とし穴まで詳細に解説されているだけでなく、Windows95で新たに採用されたコモンコントロールの解説についても(最小限度ではありますが)言及されています。一部、OLE/DDEの解説でC++を使用している箇所もありますが、Cプログラマー向けのC++解説もありますので、面食らうこともないかと思います。
「プログラミングWindows95」で圧巻だったのは、テキストエディタを自作しようという試みです。Windowsのメモ帳はテキストコントロールを中心に組み立てられているので、同様のプログラムは比較的簡単に実装できます。それをPetzoldは数回かけてアップデートし、当時のWindows95付属メモ帳を超えるエディタを作って見せたのです。
現在は本書の改訂版が出版されています。これから学ぶのであれば、時代の流れに合わせて改訂された新しい版に取り組むことをお薦めします。
ただし、本シリーズに通じて言えることですがどの版もかなりのボリュームです。その圧倒的な情報量は必ずWin32プログラミングの役に立つと信じていますが、そのボリュームに圧倒され敬遠されないことを祈るばかりです。

※なお、Petzoldの説明はわかりやすいと海外では評判ですが、日本語訳はイマイチという感が拭えません。その点を差し引きしてももっておいて損はない書籍だと思っています。

2. .NET Frawework
現在ではWin32 APIに直接触れる機会はそう多くありません。より具体的には、.NET Frameworkを通じてその上で動作するC++/CLI、C#、Visual Basic.NETを利用することが多いでしょう。この種の本は多数出版されていますが、筆者はマイクロソフト公式解説本でもある次の3点をお薦めします。
これら「ひと目でわかる~」シリーズは、対象となる言語が異なるとはいえ、基本的にはハンズオンセミナーに近い内容をStep by Stepで解説している書籍です。ただ、他の類書と異なる点は、他書ではあまり触れられていない詳細(特にC++/CLIなど)にも言及していること、マイクロソフト公式書籍と言うことで情報の確度が高いことなどが挙げられます。基本的にはVisual Studio 2010 Expressを前提に解説は進みますが、上位Editionでも通用する内容です。
これらの書籍で触れられていなかったことについては、より上級の書籍を参照せざるを得ません。しかし、これらの内容を習得していれば、その労力は決して大きなものではないでしょう。
なお、本シリーズの体裁上、リファレンスとしてはほとんど使い物になりません。その点だけはご注意下さい。

NET Framework関連の書籍は多数出版されていますが、そのうち日本人に書き下ろしで、かつ評判の良いものをご紹介します。今回ご紹介するのは「LINQテクノロジ入門」―日本マイクロソフトの赤間信幸さんによる、いわゆる「赤間本」の1冊です。私がLINQに興味を持っていた時、本屋で長時間立ち読みしてしまったのが本書になります。実を言うと私は本書を持っていません。なかなか購入のタイミングが合わず、ずっとWish List入りになっているものの筆頭です。
赤間さんの文体は「で、ある」で調のため、他の入門書に比べて少し堅い印象を受けるかも知れません。しかし解説はとても親切で、文体に似合わずサクサクと読み進められるのが読み手としては一番嬉しいところです。また、赤間さんの豊富な経験が本書の内容に反映されているため、必ずやるべきこと、思わぬ落とし穴、その他注意すべき点などが「利用者側の立場」で説明されていることが好感が持てます。

なお余談ですが、私は赤間さんの中学・高校時代の後輩に当たり、師弟関係で言うと私は赤間さんの孫弟子に当たります。


3. 開発環境
Windows周辺の開発環境についても少し触れておきましょう。個々で紹介する「Visual Studio 2010 スタートアップガイド」は、どこからどう見てもムックです。筆者も実際にはVisual Studio 2010早期購入特典として頂いたもので、しばらく放置していたものなのですが、今になって読み返してみると.NET Frameworkの基本的概念から具体的な実装方法に至るまで、事細かに解説されています。もちろんメインテーマは「Visual Studio 2010の新機能」であるわけですが、このまま放置しておくにはもったいない内容と判断したため、個々でご紹介することにしました。
ムックという性格上、1つひとつのトピックについて深入りすることができないのは仕方のないことです。しかし、ムックで今まで気付かなかったトピックを知り、より深く学習するためのきっかけとしては非常に有用だと思っています。

※あとは、WINGSプロジェクトがどれだけ頑張ってくれているかにかかっていますね。

Windowsではコマンドラインシェルの貧弱さがMS-DOS時代からの懸案であり、WSHなどの仕組みを投入したものの、抜本的な解決には至りませんでした。そこでMicrosoftが投入したのが「Windows PowerShell」という新しいシェルです。PowerShellはWindows XPとWindows Server 2003のオプションコンポーネントとして開発が始まり、Windows 7およびWindows Server 2008 R2では従来のコマンドプロンプトに変わる代替シェルとして標準搭載されるようになりました。次バージョンのWindows 8ではPowerShellがさらに強化され、いずれは旧来のコマンドプロンプトを淘汰していくものと思われます。

筆者の書棚にある書籍はここに挙げる「Windows PowerShell宣言」です。この書籍は幸か不幸か、Amazon.co.jpでのレビューがすこぶる悪いです。これについてはレビュワーが大きな誤解をしており、PowerShellとこれまでの(Unix系を含む)シェルの違いについて何も理解できていないという問題に起因すると思われます。従来のシェルは実行するコマンドを列挙するか、それに構造化プログラミングで採用されている簡単なフロー制御を付加したものに過ぎません。ところがPowerShellは関数型プログラミング言語の影響を色濃く受けており、そもそも構造化プログラミングとは別次元の言語なのです(その点ではVisual F#に近い存在とも言えます)。
本書の良いところは、後半を丸々使って実用的なサンプルプログラムを多数掲載している点にあると言えます。取り上げられたケーススタディも実際に起こりえるケースを念頭に置いて作られており、本書のサンプルをベースに実運用に耐えるスクリプティングも十分可能ではないかと考えています。
今後、PowerShellはバージョンアップのごとに機能強化が予定されていて次期Windows(Windows 8とそのサーバー版)でも大幅な機能強化が予定されています。今後使い勝手も良くなってあろうPowerShellにも是非注目したいところです。

昨今の仮想化の流れから、開発環境を仮想化するケースも増えてきていると思います。その中でWindows ServerのHyper-Vを採用するケースも見られます。開発サイドとしてはとりあえずHyper-Vで開発環境・テスト環境を構築したいというのが率直な意見でしょう。
Hyper-Vに関しては「ひと目でわかるMicrosoft Windows Server 2008 Hyper-V」と、「Windows Server仮想化テクノロジー入門」の2冊をお薦めします。
告白すると、筆者はマイクロソフト公式解説本の「ひと目でわかる」シリーズが大好きです。タイトルのイメージから初心者向けという印象を強く受けますが、実は中級者をも唸らせるような深い話題に触れていることもあります。また、他書では触れられていない(でも業務要件によっては必須となる)機能が、ごく当たり前のように解説されていることもあり、とても助かります。
次の「Windows Server仮想化テクノロジー入門」は入門と言いつつかなりハイレベルな内容です。もちろん導入部分は「入門」の名に恥じない取っつきやすさなのですが、Hyper-V 2.0の詳細を語り尽くしているのは大きいです(その解説が各トピックを通すだけでは理解できないほどの難解さ...)。また、筆者は本書で知ったのですが、Hyper-V単体での導入はデバイスドライバーの問題で失敗することが多く、Server Coreでインストールするとデバイスドライバー問題は解決するものの、別途管理用のWindows 7がないとコントロールできなくなる(WinXPではダメ)という落とし穴があります。こうした落とし穴に気付かせてくれるのも、深い解説をしてくれている書籍ならではの特権です。

この説の最後に「Windows Server 2008 R2テクノロジ入門」についてもご紹介しましょう。
これはWindows Server 2008 R2の新機能ダイジェスト、といえば説明は楽なのですが、実のところかなりの大作になっています。Hyper-Vを中心に、2008 R2で追加された多数の新機能について、詳細すぎると言えるほどの解説が加えられています(その分、過去バージョンからそのまま引き継いだ内容についてはその多くが割愛されています)。
このような「概略版」的な性格を持つ書籍は、多くの場合に興味を持った分野のより詳しい書籍を当たることになるのですが、本書に関してはそのボリュームから、そこまでする必要はないように思えます。
筆者は上掲「Windows Server仮想化テクノロジー入門」を購入する前、本書を購入して2008 R2の新機能をおさらいする予定でした。実際のところ、業務でHyper-V 2.0の採用が急遽決定したため、より深い内容の「Windows Server仮想化テクノロジー入門」を追加購入するに至ったわけです。
この種の書籍は「前のバージョンと同じだから...」と適当に読み流すと、あとで新機能による非互換製にハマり痛い目に遭いますので、くれぐれもご注意を。

4. Internal
最後に、Windowsプログラミング関係で特にディープな書籍をご紹介しましょう。まずはCOMテクノロジーの権威であるDon Boxの「Essential COM」です。前もって申し上げておきますが、内容はかなり高度です。仮に挫折したとしても、それはあなたの製ではありません。COMと言う規格が大きすぎるのが原因です。
本書ではまずDon BoxがC++のバイナリ非互換製の問題提起を行います。C++でクラスを継承した場合には通常ソースファイルの再コンパイルが必要になります。これはv-ptrやv-tblといったC++特有の仕組みや、ネームマングリングに関するコンパイラ間の非互換に起因します。そこでCOMではC++のクラスを継承した後でも、継承前のクラスとバイナリ互換を持たせるための仕組みとしてスタートしていることを、Don Boxは擬似的なCOMを作成することで証明してます。
COMそのものはその後の拡張(ActiveXやDCOMなど)によってセキュリティーホールの温床となってしまったことはご承知の通りですが、本来のCOMはより純粋な技術的要件から登場したものであることがご理解できるかと思います。

次にご紹介するのは、「Essential COM」の実質的な続編となる「Essential .NET」です。こちらもDon Boxによる書き下ろしです。
本書ではまず、COMが果たした役割とCOMによってもたらされた「DLL地獄」、そしてそれらの解決方法としての.NET Fraweworkについて述べられています。
本書の主題は.NETではありますが、COMと.NETは密接に結びついており、所々に「COMの時はこうだった」「COMの反省から.NETはこのように実装した」というようなないようが触れられています。
話題の中心である.NETテクノロジーについては、Don Boxの解説を持ってしてもやはり難解で、一読するだけでは内容をすべて把握することは難しいでしょう。しかし、MicrosoftがCOMへのアンチテーゼとして一から作り直した技術であるたため、COMでは洗練されていなかった仕様も.NETでは改善されていることがうかがい知れることができることと思います。

最後にご紹介するのは、 日本のMicrosoft MVPにも選出されている方による 「The Root of .Net Frawework」です。
本書のセンセーショナルなところは、まず冒頭で「COM」を肯定していることです。その上で、COMコンポーネント実装者がいい加減なことをやってきたがために様々な問題が発生して、COMばかり悪者にされてしまったという筋書きです。それに対してマイクロソフトは新たに.NET Frameworkを導入し、COMよりも厳しい制限の元で問題の起こりにくいアプリケーションを構築できる開発・実行環境を提供することで問題点を就職させようとしていることとのこと。
その後は.NET Fraweworkで必須となる「アセンブリ」の概念を初め、共通言語ランタイム(CLR)ではどのようなことが行われているかなど、コアな話題に突入します。これらを一度で理解するのは難しいと思いますが、理解できた暁には.NETに対する考え方が大きく変わってくるのではないでしょうか。
本書については、日本人自ら執筆したものであり、洋書翻訳で散見される「誤訳によるトラブル」がほとんどないことが安心材料の1つです。先に紹介したDon Boxの著書は世界的にも高い評価を受けていますが、2冊でかなりのボリュームとなるため、最初の1冊としては本書をお薦めします。