関数を使用したウィンドウの列挙なのであります。安全なコードを目指して前回は、アドレスや最大数などの情報を直接マシン語のバイナリコードの中に書き込んでいくということを行なっていましたね。これは、今のように小さな関数ならばそれほど問題ではないのですが、関数が大きくなるにつれて、これらの情報をどこに格納するのか(オフセット)などの情報が複雑になってくるでしょうし、ちょっとしたミスでプログラムが大暴走、ということも考えられます。今回は、より安全にプログラミングを行なうということを考えてみましょう。すればいいのかというと、マシン語の中に直接埋め込むデータが少なければ少ないほどいいわけです。そこで今回は、HSPスクリプトから関数側に渡されるすべての情報をあらかじめ構造体(HSP側から見れば配列変数)に格納しておき、この構造体のアドレス1つだけを関数に渡す(埋め込む)ということにします。パラメータに渡されるので、これを構造体アドレスとすれば、マシン語コード内には何も埋め込まずに済みますよね。構造体を定義してみることにしましょう。ENUMWND_DATA;この構造体の実体は、HSP側で準備された配列変数になります。注意するべきことは、前回はカウンタ変数のアドレスを関数に埋め込んでいましたが、この構造体はメンバそのものがカウンタになっているという点です。ソースの作成・マシン語コード抽出コールバック関数のソースコードは以下のようになります。TRUE;}コンパイルについては前回とおんなじ。マシン語情報の取り出しという手順をとります。コンパイルのたびに、前回にやったようなコマンドラインをいちいち入力していくのは面倒ですよね。そこで、コンパイルとダンプ作業を行なうバッチファイルを作成して、作業を単純化させてみましょう。いうファイル名で保存しておきます。%1.txt:END上のバッチファイルの「%1」の部分が、パラメータとして指定された文字列に置き換えられて実行されるようになります。enumwnd2とすることで、「%1」の部分はすべて「enumwnd2」に置き換えられて実行されます。このとき、まず、ソースファイルのコンパイルを実行した後、コンパイラがエラーを返さなければ、TDUMPを実行し、最後にテキストファイル形式で出力されたダンプを開くようになっています。%1.txt」の行を削除してください。実際の入出力は以下のようになります。内容は以下のようになっています。MODE32生成されたマシン語を変数に格納するのですが、前回のようにして直接手で打つのは、ミスによるバグを招く確率が非常に高いですね。今回はちょっと別の方法です。下のスクリプトを実行してみてください。"マシン語に変換できませんでした。変数に格納するためのスクリプトを作成します。このスクリプトを実行させると、以下のコードが取得できます。これをコピーしてそのままスクリプトに貼り付けてしまいましょう。$0008c25d実際に使ってみるHSPスクリプトは以下のようになります。今回はマシン語コード中に埋め込む情報はありません。パラメータに渡さなくてはなりません。初期化するのも忘れてはいけません。"個のウィンドウハンドルが取得されました。stop前回よりもすっきりした感じがしますね。安全性も、前回よりずっと高まっているのであります。