Win32APIとは Windowsが提供するWindows APIのバージョンの一つです (DXライブラリと違い、Microsoft公式のライブラリです) API (Application Programming Interface) とは OSやシステムが提供する機能にアクセスするためのインターフェースです つまりこのAPIを理解することができれば、Windowsの根幹を理解することができます また、ネイティブコードなので.Net Frameworkより処理は速いです ネット上、書籍限らず情報が圧倒的に多いのもメリットのひとつでしょう。 ただし、.Net Frameworkより冗長なコードになりがちだったり さらに公式のホームページでもわかりにくい記述があったり 日本語訳がなく英語のみだったり(色々やりたいことが増えていくと英語は避けられませんが・・・) なので この講座では 使いたいなーと思う機能に絞り 少しでもわかりやすく噛み砕いて 紹介したいと思います(^^;; C/C++で描画や音鳴らしたりGUI扱いたいとき その橋渡しになればいいかなと思います (全体的にめんどくさいものですが・・・) よく使われるであろうと思われる 基本機能をすべてまとめたライブラリも用意しました。 Win32APIライブラリ Windows 7からは本格的に上位バージョンのWin64APIも導入されましたが XP,Vistaでは動かないためWin32APIはまだまだ現役です (逆にWindows 7でもWin32APIは動く) また、Win64APIでも基本理念はそこまで違いはないため Win32APIが理解できればWin64APIもすぐ理解できるでしょう (あとはネット上の情報が多いのも利点の一つです) 第1回では、Win32APIに入る前に ウィンドウズプログラムの基本的な概念を説明します。 おそらく、一度見ただけでは理解できないかもしれません プログラムを実際に動かしたあと見返してくれれば理解が深まると思います まず、ウィンドウズプログラミングをする上で重要となる用語を説明します SIZE(30){ COLOR(#ffaa00){ ■ウィンドウ } } SIZE(30){ COLOR(#ffaa00){ ■メッセージ } } SIZE(30){ COLOR(#ffaa00){ ■ハンドル } } SIZE(30){ COLOR(#ffaa00){ ■ダイナミックリンクスライブラリ(拡張子.dll) } } SIZE(30){ COLOR(#ffaa00){ ■COM } } ----------------------------------------- SIZE(30){ COLOR(#ffaa00){ ■ウィンドウ } } ブラウザにしたってそうだし、エクセルやワードだってそうですが アプリケーションをグラフィカルに表示して、マウスなどで操作できるようになっています(GUIと呼びます) 実は、意外に思われるかもしれませんが ウィンドウズ上では ボタンやエディットボックスなどのコントロールもウィンドウの一種です ここで大事になるのは SIZE(25){ COLOR(#00aaff){ ○ウィンドウクラス } } SIZE(25){ COLOR(#00aaff){ ○ウィンドウスタイル } } の2つです この2つがウィンドウの機能を決めます ウィンドウクラスはウィンドウの機能を決めます たとえば、ボタンを作りたいならばボタン用のウィンドウクラスが予め用意されています なお、自分でウィンドウクラスを定義してそのウィンドウを作ることも可能です ウィンドウスタイルはウィンドウの外見などを決めます ウィンドウの右上の最大、最小ボタンを設定したり ウィンドウサイズの変更を可能にするなどの設定ができます SIZE(30){ COLOR(#ffaa00){ ■メッセージ } } ウィンドウに送られてくる処理する内容の通知をメッセージと呼びます たとえば、キーが押された、マウスが押されたなどのときに それに対応したメッセージが送られ、そのときにやりたい処理をさせます。 メッセージは順番に送られてきて、 メッセージキューと呼ばれるものに詰められます、 そして基本的にはメッセージが送られてきた順番に処理をしていきます(FIFO) 従来の処理がウォータフォール型(処理の流れが一直線)の コンソールのプログラムに対し、 メッセージが送られたときに対応した処理を書くので イベントドリブン型といいます。 ここがコンソールのプログラムと大きく違う点で初心者が悩む点です SIZE(30){ COLOR(#ffaa00){ ■ハンドル } } ウィンドウズが提供するリソースを識別するためのポインタです。 どんなものがあるかというと ○ウィンドウ系ハンドル ○描画系オブジェクトハンドル ○プロセス系ハンドル ○レジストリ系ハンドル ○メニュー系ハンドル などがあります ハンドルはOSのカーネル(OSのコア) となる部分でリソースを作成し、それを操作するために提供されます ハンドルの実態はvoidポインタです つまり、データの型を隠蔽したポインタということになります なのでハンドルは使い終わったら、その種類によって適切な解放関数を呼んで解放しなければなりません (ハンドルのメモリリークをハンドルリークと呼ぶ) 具体的には、次の3つのダイナミックリンクスライブラリ(DLL)から提供されます SIZE(20){ COLOR(#00aaff){ ・kernel32.dll } } SIZE(20){ COLOR(#00aaff){ ・gdi32.dll } } SIZE(20){ COLOR(#00aaff){ ・user32.dll } } この3つのDLLはウィンドウズのコアとなるライブラリです SIZE(30){ COLOR(#ffaa00){ ■ダイナミックリンクスライブラリ(拡張子.dll) } } ダイナミックリンクスライブラリはライブラリの一種です。 ライブラリと言われてもピンとこない方、 コンパイル済みのプログラムの部品と言ったほうがしっくり来るかも知れません VisualStudioC++でコンパイルした.cppファイルは.obj形式として出力されます (VC++でビルドを行うとDebugやReleaseフォルダが作成され、 .objファイルができているので見てみるとよいでしょう) 複数の.objファイル(.libファイル含む)をリンカーと呼ばれるもので合体させることで 実行ファイル.exeができます。 ここで問題となるのは、プログラムをビルドするたびにリンクという作業を行わなければなりません (VC++ではビルドを行うことでコンパイル・リンクの作業をまとめてやってくれる) 小規模なプログラムならよいですが、 大規模なプログラムになるとプログラムをビルドするたびにリンクの作業で時間を取られることになります アプリケーション本体でのライブラリのリンク作業を ダイナミックスリンクライブラリ(DLL)は分離することができます 具体的には、アプリケーションを実行するときにライブラリ(.dll)をリンクするという形式です (したがって、DLLを使用したアプリケーションは、実行ファイルと同じところにDLLを置くか、 DLLへのパスを通しておかなければ実行ファイルが起動できません) DLLを作るためには別途DLL用プロジェクトを作る必要があります また、これが重要なことなのですが 実装部分のみを差し替えることでプラグイン的な使い方ができます SIZE(30){ COLOR(#ffaa00){ ■COM } } COMと関連して以下の用語も重要です ○OLE ○ActiveX ○COM ○.Net Framework 詳しい説明は下にパワポで用意しました &ref(COM.pptx); COMだけに関して言えば、 インターフェイスと実装を完全に分離させたもので、実態は大抵の場合、DLLです DLLの実装部分を書きかえることで前のDLLと差し替えるだけで簡単にバージョンアップさせることができます 上記のDLLのプラグイン機能を最大限に生かしたものでしょう なお、DirectXもCOMです #vote((^ω^)やったお[18],何これwww意味不すぎwww[18],。(`ω´#)。あぁん?最近、だらしねぇな[13]) |(^ω^)やったお|18| |何これwww意味不すぎwww|18| |。(`ω´#)。あぁん?最近、だらしねぇな|13|