コールバック関数のコードを作成してみます。関数は以下のように定義されています。コールバック関数のアドレスになります。コールバックが呼び出されるようになっています。パラメータに、それぞれのトップレベルウィンドウのハンドルが渡されています。指定された値が格納されるようになっています。通常、(HSPのマシン語コード用としてではなく)Cで書く場合には、ソースプログラムの1つの例としては以下のようになると思います。この例では、グローバル変数として確保された配列変数にウィンドウハンドルを格納していくことになります。初期化する必要がありますが。これをHSPで使用されるマシン語コード用に書き換えてみましょう。側で確保された変数を使用します。側の変数であるとし、プログラム中ではその変数を指すポインタを使用します。ソースプログラムは以下のようになります。TRUE;}ウィンドウハンドル用配列変数やカウンタ用変数のアドレスは、実際にはスクリプト実行時まで分かりません。ような、後で見て一目でわかる数値をキャストして入れておきます。ここでは、取得できる最大数も変えられるように、上のようにしておきます。できるだけ付けるようにしましょう。しないと、コンパイル時に変数への最適化が行なわれて、マシン語コードの中に、データを埋め込まなければならない部分がたくさん出てきてしまうこともあります。記述する位置にも注意する必要があります。)の内容に対しての最適化の防止を指示していることになってしまいます。*)0x11111111;と記述しなければならないわけです。付けないでコンパイルしました。今回の場合は、これらの情報がマシン語コードの中で複数に分散して出てくることはないと筆者が判断したためです。今回のように短いコードの場合は、付けるのと付けないのとでは、最終的なマシン語のサイズが大きく変わってきてしまうので、状況に応じて判断する必要があります。コンパイル完成したらこのソースプログラムをコンパイルしますが、このときに、オプション指定でマシン語を含むリスティングファイルを出力するように指定しておきます。「C/C++」タブカテゴリ「ファイルリスティング」リスティングファイルタイプ「マシン語コードを含む」を選択という順序で設定できます。)ができていると思います。以下のようなファイルが作成されます。(コンパイラの種類やバージョンのほか、最適化などの設定によっても異なります。ENDSEND上の、色つき表示されている部分では、左側がコードの先頭からのオフセットを、右側の部分がマシン語コードをそれぞれ示しています。これらはどちらも16進数表示になっていることに注意してください。スクリプトを実行した時にマシン語コードがメモリ上にこのように配置されるように、配列変数に値を格納しなければなりません。今回はコードの量が少ないですし、今回が初めてであるということもあるので、配列変数に直接書き込んでいくことにします。メモリ管理は「リトルエンディアン方式」と呼ばれ、下位バイトのほうが先に格納されるようになっています。12」の順で格納されるのです。c0となっている部分のマシン語コードを配列変数に格納するには、まず、以下のように並べて、これを4バイトずつに区切ってみます。...それをバイトごとに逆転させて格納します。$33057c33...これでマシン語がメモリ上に格納できたわけです。アドレスを指定すればいいのです。関数を呼び出してウィンドウハンドルが取得できるかというと、そうではありません。11」などとなっていた部分に正しい値を格納しなければなりません。正しい値を格納しましょう。上のコードの場合は、以下のようになります。ハンドルを格納する配列変数のアドレス以上から、全体のスクリプトは次のようになります。"個のウィンドウハンドルが取得されました。