1. やり方
では Win16 のプログラミングを始めましょう。といっても、今では普通には Microsoft 社から Win16 用のコンパイラを取得する/買うことはできません。そこで、Open Watcomのコンパイラとその IDE を使用します (※)。
Open Watcom を使う
適当にインストール・各種設定(重要!英語をよく読んで設定してください)をしたら、「IDE」(ide.exe)を開きます。そして、「File」メニューから「New Project」を選択します。プロジェクトを保存する場所を尋ねてくるので、新しいフォルダを作ってそこにプロジェクトを保存するといいでしょう。ただし、このプログラムは英語のプログラムなので、プロジェクトを置く場所に日本語を含めないようにしてください (誤作動が起こるかもしれません)。
「New Target」というダイアログが開きます(こんな感じ)。そこで、「Target Environment」から「Win16」を選択し、「Image Type」から「Executable [.exe]」を選択して決定します。すると IDE に、ソースファイル (Source files) が空のプロジェクトができます。
ここにきて分かるように、Win32 アプリケーションも DOS アプリケーションもこのプログラムで作成できます。やり方は以下に示すこととほぼ同じです。
まず、ソースを追加します。「Source files」のリスト(枠の中)を右クリックして「New source」、またはキーボードの Insert キーを押します。「Add File(s) to 'xxxxx.exe'」というダイアログボックスが出るので、「File Name」に適当なソース名を入れて「Add」をクリックします。そして「Close」をクリックすると「Source files」にソースが追加されます。このとき、ソース名は存在しなくても構いません。存在しない場合、エディタが自動作成してくれます(メモ帳の場合)。
ソースを編集するには、「Source files」内のソース名をダブルクリックします。するとメモ帳が起動するので、ここでソースを編集してください。もし自分の好きなエディタを使用するなら、「File」メニューの「Set Text Editor」を選択してください。このようなダイアログが出ます。「Enter editor file name」にプログラム名、「Enter editor parameters」に引数を指定します。この引数にファイル名を表す「%f」を含めるとそのエディタでソースファイルを開けます。行番号を表す「%r」を含めると、エラーがある行にジャンプする機能が使えて便利です。
コードを書いてみる
ではコードを記述します。cpp のソースファイルにとりあえず以下のように記述してみました。
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ::MessageBox(NULL, "Hello from Win16!", "メッセージ", MB_ICONASTERISK); return 0; }
コンパイルするには、「Targets」メニューの「Make」を選択するか、キーボードの F4 キーを押します。「IDE Log」ウィンドウが開き、コンパイルの結果が表示されます。上のプログラムで、以下の結果が出ました。
「Warning」がやたら多いですが、「no reference to formal parameter 'xxx'」というのは、「パラメータ 'xxx' が参照されていません」ということで、無視可能です。一番下に「Execution complete」と、「成功しました」という意味が出ているので成功です。
このプログラムを実行するには、「Targets」メニューの「Run」を選択するか、キーボードの Ctrl+R を押します (Ctrl を押しながら R)。実行結果はやってみてのお楽しみ。
注意
Win32 と同じようにプログラムを作っていくと、一部の内容がヘッダーファイル (windows.h、win16.h) に定義されていないことがあり、そのせいでエラーが出ることがあります。現在は大丈夫だと思われますが、下記の例外を除いても未定義エラーが出る場合、ある程度内容が十分な win16.h を用意したので、それを利用してください。また、Watcom には mmsystem.lib が存在しないので、MCI などのやり取りをする関数が使えません。そこで、先の win16.h とこの mmsystem.lib をまとめて配布します。win16.h は <watcom>\h\win に、mmsystem.lib は <watcom>\lib286\win にそれぞれコピーしてください (<watcom> は Watcom をインストールしたディレクトリ)。win16.h に関しては、古いものはリネームしておくといいかもしれません。
こちらをクリックしてダウンロードください (2004/08/10 更新)。
なお、それでも Win32 で使っていた関数で定義されていないといってエラーが出る場合、その関数は Win32 で初めて出た、と見なしたほうがいいでしょう。実際に、CreateFile やCloseHandle などは Win32 で初めて出た関数です。
メモ
Watcom では、エクスポートファイル「だけ」でライブラリファイル (.lib) が作成できます。エクスポートファイルで「LIBRARY 文」と「EXPORTS 文」を記述し、次のコマンドで作成します(先頭の > は不要、<lib-name>はライブラリ名、<export-file>はエクスポートファイル、<lib-file>はライブラリファイル)。
> vi -s def16lbc.vi -p"<lib-name>" <export-file> > wlib -b -n -p=16 -io -ii <lib-file> @<lib-name>.lbc
なお、先に「def16lbc.vi」というファイルをエクスポートファイルと同じフォルダに作成します。内容はこちらです (コピーして貼り付けを推奨、スペースなどに注意、最後は改行)。
set norc set nomagic set magicstring = () %s/^LIBRARY.*$//g %s/^EXPORTS.*$//g %s/[ \t]//g %s/^\([A-Za-z0-9_]*\)\@\([0-9]*\)$/++\1.\U%1\E.\2/g w! %1.lbc q!
大体見て分かる通り、「LIBRARY 文」と「EXPORTS」は必要ありません。ライブラリの名前は、ファイル名で指定した<lib-name>となります。
また、DLL からもライブラリファイルを作成できます。これは、コマンドラインで次のように入力します。
wlib <lib-name> +<dll-name>
たったこれだけでライブラリが作成できます。ただし、<lib-name> が存在すると、それに内容が追加されてしまうので注意してください。
最終更新日: 2004/08/10