LCC-Win32でHSPの拡張プラグインを作ろう

ダウンロード
 まずは、ダウンロードだ。LCC-Win32のホームページに行って、少し下の方にある「lcc-win32」をクリックするとダウンロードできる。
 英語に自信があるか、なくてもチャレンジする気のある人は「Windows API Documentation」や「User Manual for lcc-win32」もダウンロードするといいだろう。
 もっとも、どれもサイズがでかいので、ダイアルアップユーザーにはちと辛い。

インストール
 ダウンロードしたファイルをダブルクリックすると、インストールが始まる。
 インストール先のフォルダは、「Program Files」などスペースを含むフォルダの下は避けた方がいい。

ライブラリのビルド
 初めてインストールする場合、ライブラリがビルドされるのだが、なぜかこれが途中で止まってしまう。経験のあるユーザーならどうすればいいか見当がつくけれども、「プログラムなんてHSPしか触ったことがない」という人にはちょっと無理だろう。
 そこで、ライブラリをビルドするスクリプト(for HSP2.61)を書いた。このスクリプトはanthspex.dllを使うので、持っていない人はダウンロードしてほしい。
 このスクリプトを起動すると、まずフォルダ選択ダイアログが表示されるので、lcc-win32をインストールしたフォルダを選択しよう。そうすると、buildlib¥*.expに対してbuildlibが実行され、最後に、できた*.libがlibフォルダにコピーされる。終了までには、かなりの時間がかかるので本でも読んでいるといいだろう。
 何かの事情で途中で終了してしまった場合は、再度実行すればいいようになっている。必要な作業が残っていれば、それを実行するし、何もする必要がなければ何もせずに終了するのだ。

プロジェクトの作成
 ライブラリのビルドが終わったら、いよいよ拡張プラグインの作成だ。ここでは、anthspex.dllの拡張命令の中からdeldir命令を作って見ることにする。Cの標準ライブラリ関数を呼びだしているだけなので、とても簡単だからだ。
 スタートボタン → プログラム → lcc-win32 →lcc-win32とたどってクリックすると、lcc-win32のGUIであるweditが起動する。



 最初にやることは、プロジェクトの作成だ。「Project」メニューの「Create...」をクリックすると、次のようなダイアログが表示される。



 まず、いちばん上のプロジェクト名を入力しよう。ここでは、仮に「test」とする。
 次にディレクトリ名(フォルダ名)の入力だが、予めディレクトリを作っておく方がよい。エクスプローラかマイコンピュータ等でlcc-win32をインストールしたフォルダ(以下、「lcc:¥」で表すことにする)の下の「projects」フォルダに移動し、「test」フォルダを作ろう。
 それから、weditのダイアログに戻り、右上の「Browse」ボタンをクリックするとフォルダ選択ダイアログが表示される。デフォルトでlcc:¥projectsが選択されているはずなので、 その下のtestフォルダを選択して「OK」ボタンをクリックしよう。  そうすると、2つのディレクトリ入力ボックスにパスが表示される。

 「Options」は別に変更する必要はないが、その下の「Type of project」では「Dynamic Link Library(dll)」を選択しよう。

 このダイアログの作業はこれで終わりだ。「Create」ボタンをクリックしよう。



 上のダイアログは、ウィザードを使ってプログラムスケルトンを作るか訊いているものだ。もちろん「はい」をクリックする。



 このダイアログでは、別に変更することはない。そのまま、「Ok」ボタンをクリックしよう。
 すると、ファイルが作られたというダイアログが表示されるので、「OK」ボタンをクリックする。



 上のコンパイラ設定ダイアログでは、「Optimize」にチェックを入れ、「Generate debug info」のチェックを外すだけだ。

 この後、リンカー設定ダイアログとデバッガ設定ダイアログが表示されるが、変更点は何もないので、リンカー設定ダイアログでは「次へ」ボタンを、デバッガ設定ダイアログでは「完了」ボタンをクリックしよう。
 これで、設定は終わり、test.cのスケルトンプログラムが表示され、makefileが作られる。test.cはlcc:¥projects¥testに作成され、makefileはlcc:¥projects¥test¥lccに作成される。

日本語フォントの設定
 lcc-win32が作ったスケルトンプログラムは、そのまま修正の必要はないが、デフォルトではエディタの日本語が文字化けしてしまうので、以下のようにして日本語が正しく表示されるようにしよう。
  1. 「Project」メニューの「Configuration」をクリックする
  2. 「Workspace」タブをクリックする
  3. 「Fonts」ボタンをクリックする
  4. フォント選択ダイアログが表示されるので、「MS ゴシック」など適当な日本語フォントを選択して「OK」ボタンをクリックする
  5. 「Configuration」ダイアログの「OK」ボタンをクリックする。
 この作業は、weditを起動する度にやらなければならない(ただし、フォントの変更自体は最初の1回のみでよい)ので面倒だ。そこで、これを自動的にやってくれるHSPスクリプトを書いた。やはり、anthspex.dllを使っている。
 weditを起動するかわりにこのスクリプトを起動すれば、自動的にweditを起動してフォント設定をやってくれる。
 ただし、7行目のweditのパスを環境に合わせて書き換えなければならない。また、バージョンアップ時にときどきweditのタブやダイアログのデザインを変えるようなので、その場合はそのままでは動かない可能性が高いので、調整が必要だ。

プログラムの入力
 以下のプログラムをtest.cの最後に追加しよう。
//-----------------------------------------------------------------------------
// 空のフォルダの削除
//-----------------------------------------------------------------------------
long WINAPI __declspec(dllexport) WINAPI
deldir(UCHAR* dir,int p2,int p3,int p4)
{
	return rmdir(dir);
}
 1〜3行目は注釈だ。
 4行目はおまじないのようなもので、HSPの拡張命令にする関数では、必ずこのように書く。
 5行目の先頭が関数名だが、HSPの#func命令で関数名とは異なる命令名をつけることもできる。
 ()内は引数で、HSPでは必ず4つの引数を指定する。詳細は、HSPの「拡張プラグイン作成リファレンスマニュアル(上級者向け) (hspdll.htm)」を参照してほしい。
 7行目がプログラム本体で、Cの標準ライブラリのrmdir関数を呼びだし、rmdirの戻り値をそのままHSPに返している。
 rmdirは空のフォルダを削除する関数で、成功すれば0が、失敗すれば-1が返される。HSPでは、戻り値が1〜255ならその値をエラーコードとするエラーが発生し、戻り値が0または負なら絶対値がstatに代入される。つまり、rmdirが成功すればstatが0になり、失敗すれば1になるというわけだ。

コンパイル
 プログラムを入力したら、「Compiler」メニューの「Make」をクリックするか、F9キーを押してコンパイルしよう。
 入力ミスがなくても次のような警告が表示されるだろう。

Warning a:¥!free¥lcc¥projects¥test¥test.c: 57 missing prototype for rmdir

 「rmdirの関数プロトタイプがない」という意味だが、詳細は省略する。なお、test.cの57行目についてのメッセージだ。
 weditの画面では「¥」のかわりに半角のバックスラッシュ(\)が表示される。日本語フォントの「¥」は英語フォントではバックスラッシュになるのだ。
 エラーではなくWarning(警告)で、このままでも動くが、やはり修正しておこう。
 どう直せばよいかというと、test.cの上から2行目に「#include <windows.h>」という行があるが、その下に「#include <direct.h>」という行を挿入すればよい。

 修正したら、もう一度コンパイルする。入力ミスがなければ、今度はうまく行って、次のように表示されるだろう。

test.dll built successfully. (13.6 sec).

 lcc:¥projects¥test¥lccにtest.dllができているので、これをHSPをインストールしたフォルダに移動しよう。

HSPで動かしてみよう
 テストとして、次のようなスクリプトを書いた。
#uselib "test.dll"
#func deldir deldir 1

	dir="testdir"
	mkdir dir
	dialog "testdirフォルダができていることを確認してください"
	deldir dir
end
 1行目で「test.dll」を使うことを宣言している。
 2行目は命令の定義で、命令名・関数名・命令タイプの順だ。関数名はtest.cに書いた関数名と同じにしなければならないが、命令名は「rmdir」など、好きなものに変えてよい。命令タイプについては、HSPのマニュアルを参照してほしい。
 スクリプトはmkdirでフォルダを作成し、フォルダができたことを確認するためにdialog命令でダイアログを表示し、その後、そのフォルダを削除している。

DLLにバージョンリソースをつけよう

ホームページ HSP ANTARES' HSP拡張プラグイン基本セット