Windowsでアプリケーションを開発する

WindowsでGUIアプリケーションを開発しようと思った場合、.NET技術やWeb技術をベースに構築された実装系を使うことが多いだろう。こうした技術は抽象度が高く、短いコードで便利なGUIアプリケーションを開発することが可能だ。

また、Web関連技術の著しい発展もあり、Web技術を使ってGUIアプリケーションを開発するというやり方もある。どのアプローチを採用する場合でも、高い抽象度が実現されており、決まりきった機能であれば苦労することなく開発できるという現状だ。

こうした中で困るのは、上記の技術が想定していないUI/UXを実現しようとするときだ。そうなると、もっと根幹的な機能を呼び出して使う必要が出てくる。結局、基礎に近い技術を使ったほうが簡単に開発できるのだ。新しい技術だけを使っていると、こうした場合に苦労する。

カーネルに特有の機能を使いたい

これまで、何度かPOSIXについて触れた。LinuxやMacといったUNIX系のオペレーティングシステムはPOSIXにある程度準拠している。このため、POSIXに従って開発されたソースコードであればそのままビルドできる、または、ちょっとした移植作業を行えばビルドできるようになる。Windowsはそうしたオペレーティングシステムに比べるとPOSIXへの対応は弱いが、代表的なところはある程度カバーされている。

困ったことになるのは、POSIXで規定されていない機能を使いたい場合だ。例えば、ファイルへの書き込みをモニタリングし、書き込みがあった段階で何らかの処理を行いたいとしよう。これはよくある要望なのだが、通常はカーネルが提供しているユニークな機能を利用する。LinuxであればLinuxカーネルが、FreeBSDであればFreeBSDカーネルが、WindowsであればWindowsカーネルがそうした機能を提供している。この手の機能にはオペレーティングシステム間の互換性がないことが多く、対象のオペレーティングシステムでしか使えず、移植性はない。

しかし、こうした機能も使いたいものは使いたいのだ。当然、WindowsにもいくつものこうしたWindows専用の機能が用意されている。

Windows APIで行く

Windowsでアプリケーションを開発する場合、いくつものプログラミング言語やコンポーネント、フレームワーク、ライブラリ、ツールキット、開発環境などから、必要な技術を選定することになる。多くのケースで、最も流行している抽象度の高い技術を採用することになるだろう。なぜなら、その技術には便利な機能が豊富に提供されており、開発速度が速いからだ。

一方、そうした技術の根幹的な技術として存在しているのが「Windows API」だ。この機能は「Win32 API」とも呼ばれる。Windowsが提供する基本的な機能の一つであり、抽象度の高い多くの技術がベースとしてWindows APIを活用している。

せっかくWindowsでC言語プログラミングをするなら、このWindows APIを直接使う方法を経験しておくとよいと思う。当然、Windows APIを使って開発した機能はLinuxやMacではビルドすることはできない(レイヤ技術やエミュレーションを使えば話は別だが)。同じ機能をLinuxやMacで実現しようとすれば、同じようにLinuxやMacに特有の機能を使って実装することになるはずだ。

しかし、Windows APIはWindowsの考え方がよく反映されており、Windowsを理解する上でよいルートになると思う。Windows APIを使ったコーディングは、現在の抽象度の高いプログラミング言語のライブラリやコンポーネント、開発ツールと比べると低レベルで難しいものではあるのだが、その分細かい制御ができることが多い。

簡単だが実用的なサンプルでWindows APIの使用例を見ていく

Windows APIはWindowsの根幹的な機能であり、さまざまな機能が提供されている。このためどこから取りかかればよいかわからないかもしれない。とりえあず、Windows APIのドキュメントとして次のドキュメントは押さえておきたい。

本連載ではまずシンプルなところからWindows APIを使ってコマンドを作る方法を取り上げていこうと思う。

  • Windows APIを使ったソースコードのサンプル

    Windows APIを使ったソースコードのサンプル

しばらく取り組むのは、対象となるファイルやディレクトリをモニタリングして、対象が更新された場合にイベントを発生させるようなプログラムだ。ファイルやディレクトリ以下のファイルへの書き込みをモニタリングし、書き込みが発生したのをイベントとして別の動作を始める。シンプルだが、カーネルの提供するユニークな機能のサンプルとして扱いやすいものだと思う。

抽象度の高いプログラミングに慣れているなら楽しもう

現在人気のある抽象度の高いプログラミング言語に慣れていると、C言語やC++でWindows APIを使うというのは、低レベルで難しいコーディングのように思えるかもしれない。しかし、抽象度の高いプログラミング言語では実現できない細かい調整や指定ができることもわかってくると思う。慣れるとこれはこれで便利なのだ。

抽象度の高いプログラミングに慣れているなら、Windows APIをそうした新しい体験ができるものとして、楽しんで取り組んでもらえればと思う。うまくいけば、これまでよりも高速で小回りの効くツールの開発やアプリケーションの開発ができるようになるかもしれない。Windowsを使っていくのであれば知っておいて損のない機能だ。ぜひこの機会に取り組んでもらえればと思う。

参考