int PASCAL WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int cmdshow){ DialogBox(hinst, "EASYPLAY", NULL, easyplay); return 0; }DialogBox APIは、ダイアログボックスを生成します。ダイアログがクローズされると、 APIからリターンしてWinMain()に戻ってきます。
16ビットの場合、単に関数へのポインタを渡すだけでは、うまく動作しません。 これは、OSがプログラム中の関数を呼び出す場合に、どのプログラム(インス タンス)の関数か区別しないといけない(そうしないとグローバル変数に正しく アクセスできない)のに、16ビットWindowsではすべてのプログラムがアドレス 空間を共有しているという構造に由来するものです。 そのために、MakeProcInstance() と FreeProcInstance()が必要になります。 これは関数へのポインタに細工をして、個々のプログラム(インスタンス)を 区別させると考えれば良いでしょう。(正確なことを知りたい方は、 「インスタンスサンク」をキーワードに文献をあたってみてください。)
32ビットではこの二つの関数は「何もしない関数」としてwindows.h内でマクロ定義 されているので、ソースを共通化するために32ビットでもこの二つの関数を呼び出す ように記述して何ら問題ありません。(FreeProcInstance()は本当に何もしない。 MakeProcInstance()は第一引数を戻り値にコピーするだけ。) ただしそのせいで、C言語モードで「コードは効果を持たない」という警告を出す コンパイラが存在するようです。
なお、16ビットでも「スマートコールバック」オプションのあるコンパイラを使えば MakeProcInstance()、FreeProcInstance()は不要になります。
16ビットでは、コールバック関数はexportする必要があります。 これはDEFファイルで行う場合とCソース中でexportキーワードを使って行う場合があります。 これを忘れると、奇妙な動作をして別のバグと勘違いすることがあります。 これも正確に説明しようとするとマシン語コードをもちださなければならなくなるので、 「関数をプロセスの外から呼び出せるようにするためのおまじない」ぐらいに 考えておいてください。
一つ上のページに戻る