Win32API関数を使った、Windowsプログラムです。 最初は、WinMain関数です。
// // Windows プログラム // #include <windows.h> #include <tchar.h> // グローバル変数 HINSTANCE hInst; // 現在のインターフェイス // アプリケーション開始位置 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow) { hInst = hInstance; // インスタンスハンドル保存 }
コンパイルして実行しても何も起きません。 しかし、きちんと起動し終了しています。
次のリストを見て下さい。
#include <windows.h> // グローバル変数 HINSTANCE hInst; // 現在のインターフェイス // アプリケーション開始位置 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { hInst = hInstance; // インスタンスハンドル保存 }
WinMain関数は Win32API 関数です。 Windowsアプリケーションはここからスタートします。 C/C++ の main 関数に相当します。 そして、{ } の中にプログラムを書いていきます。 WinMain関数を抜ければアプリケーションは終了します。
Windows のプログラムでは、HINSTANCE のような変な型が出てきます。 しかも沢山あります。 しかし、何かの別名であって、元を辿れば int のような基本的な型です。 ただ、最初の"H" はハンドルと覚えておきます。
Unicode という文字コードがあります。 "win121.cpp" はそれに対応した書き方をしています。 これも別名になっているだけで、上と全く同じです。
さて、WinMain関数の引数を見ると、どこかから、4つの値が送られてくることがわかります。 2つは受け取ります。 hInstance は、このアプリケーションに割り当てられた値です。 Windows では、複数のアプリケーションが動いています。 それらを区別するためです。 これは、プログラムでも使うのでグローバル変数に保存しておきます。
これで解説は終わりです。 まあ、こんなもんだと思って下さい。 細かいことは、後回しにするのが賢明です。
アプリケーションインスタンスのハンドル hInstance を取得する方法は3つあります。
値は、いつどこでも取得できるのです。 しかし、最初の方法を採用しました。
Windowsプログラムでは、不思議なデータ型が出てきます。 しかし、C/C++の型の別名です。 ただ、Win32 API 関数を使うときは不思議な型を使うべきでしょう。
C/C++ では、int は何ビットか固定されていません。 Win32API 関数の方は固定した作りになっています。 そのギャップを埋めるために工夫してあります。 表にすると次のようになります。
型 | 内容 |
---|---|
CHAR | char |
INT | signed int |
FLOAT | float |
VOID | void |
LPCHAR, PCHAR | char* |
これ以外にも沢山あります。 ただ、Win32API関数の定義に従うだけですから、覚える必要はないです。 また、"LPCHAR" のように、"LP" を付けるとポインタになります。 "P" を付けてもポインタになります。 ただ、どちらも同じ内容です。 これは他の場合もそうなっています。
文字列の方は複雑です。 文字コードの変更があったからです。 古い Windows95 では、マルチバイト文字、新しい Windows では、Unicode となりました。 そして、C/C++ では、コードを書く段階でどちらかにしなければならないのです。 それでは不便ということで、マクロが用意されています。 次の表は、最初のように書いた場合、UNICODEマクロが定義されていれば、Unicode 対応となり、 そうでなければ、マルチバイト文字対応となります。
型 | Unicode | マルチバイト文字 |
---|---|---|
TCHAR | WCHAR | CHAR |
LPTSTR | LPWSTR | LPSTR |
LPCTSTR | LPCWSTR | LPCSTR |
また、"Hello" はマルチバイト文字、L"Hello" は Unicode です。 これは、TEXT マクロを使います。 TEXT("Hello") は、UNICODEマクロが定義されていれば、L"Hello" 、そうでなければ "Hello" と置き換えてくれます。
文字列を扱う関数も影響を受けます。 strcat はマルチバイト文字、lstrcat は Unicode です。 "l" を付けます。