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が作ったスケルトンプログラムは、そのまま修正の必要はないが、デフォルトではエディタの日本語が文字化けしてしまうので、以下のようにして日本語が正しく表示されるようにしよう。
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 end1行目で「test.dll」を使うことを宣言している。 2行目は命令の定義で、命令名・関数名・命令タイプの順だ。関数名はtest.cに書いた関数名と同じにしなければならないが、命令名は「rmdir」など、好きなものに変えてよい。命令タイプについては、HSPのマニュアルを参照してほしい。 スクリプトはmkdirでフォルダを作成し、フォルダができたことを確認するためにdialog命令でダイアログを表示し、その後、そのフォルダを削除している。 |
DLLにバージョンリソースをつけよう |