コールバック関数のコードを作成してみます。関数は以下のように定義されています。コールバック関数のアドレスになります。コールバックが呼び出されるようになっています。パラメータに、それぞれのトップレベルウィンドウのハンドルが渡されています。指定された値が格納されるようになっています。通常、(HSPのマシン語コード用としてではなく)Cで書く場合には、ソースプログラムの1つの例としては以下のようになると思います。この例では、グローバル変数として確保された配列変数にウィンドウハンドルを格納していくことになります。初期化する必要がありますが。これをHSPで使用されるマシン語コード用に書き換えてみましょう。側で確保された変数を使用します。側の変数であるとし、プログラム中ではその変数を指すポインタを使用します。ソースプログラムは以下のようになります。TRUE;}ウィンドウハンドル用配列変数やカウンタ用変数のアドレスは、実際にはスクリプト実行時まで分かりません。ような、後で見て一目でわかる数値をキャストして入れておきます。ここでは、取得できる最大数も変えられるように、上のようにしておきます。できるだけ付けるようにしましょう。しないと、コンパイル時に変数への最適化が行なわれて、マシン語コードの中に、データを埋め込まなければならない部分がたくさん出てきてしまうこともあります。記述する位置にも注意する必要があります。)の内容に対しての最適化の防止を指示していることになってしまいます。*)0x11111111;と記述しなければならないわけです。付けないでコンパイルしました。今回の場合は、これらの情報がマシン語コードの中で複数に分散して出てくることはないと筆者が判断したためです。今回のように短いコードの場合は、付けるのと付けないのとでは、最終的なマシン語のサイズが大きく変わってきてしまうので、状況に応じて判断する必要があります。コンパイル完成したらこのソースプログラムをコンパイルしますが、BCCはコマンドラインコンパイラであるので、MS-DOSプロンプトから行なう必要があります。作業ディレクトリを決定し、そこにCで書いたソースファイルを保存しておきます。』として保存してあることにします。次に、MS-DOSプロンプトを起動してから、作業ディレクトリに移ります。通常のWindowsプログラミングの場合と違って、MS-DOSの場合、「カレントドライブ」の概念があり、「カレントディレクトリ」はそれぞれのドライブに1つずつ割り当てられるので、ディレクトリ移動はドライブとディレクトリで別々に行なう必要があります。Dドライブなら『D:』というようにします。コマンドを使用して、ディレクトリを移動します。(作業ディレクトリ名)』と入力して、[Enter]を押します。このときのディレクトリ名は、絶対パス(フルパス)で指定しても、カレントディレクトリからの相対パスで指定しても、どちらでもよいです。今回の場合のDOSウィンドウの表示は以下のようになります。強調表示されている部分は、プログラマが入力したものになります。ここではディレクトリ名を相対パスで指定しています。hspmcnD:\hspmcn>BCCでのCコンパイラは、「bcc32.exe」という実行可能ファイルです。.obj)が出来上がります。(ソースファイル名)ここで、『-c』は、「コンパイルはするがリンクはしない」ということを指定するオプションパラメータです。(オプション指定は大文字・小文字が区別されるので注意。今回はマシン語を生成するのが目的であって、実行可能ファイルやDLLを作成するわけではないので、このオプションを指定しておく必要があります。他にもいろいろとオプションを指定することができますが、ここでは詳しく説明しません。オプション指定についての細かい指定はBCCのリファレンスを参照してください。言うなら、コードサイズ最適化オプション『-O1』(「ゼロ」ではなくて、アルファベットの大文字の「オー」です)や、速度最適化オプション『-O2』などがあります。実際にコンパイルを行なうと、次のように表示されると思います。)D:\hspmcn>上の例では、最適化オプションなんかも指定していますが、指定しなくでも別にいいです。マシン語コードのサイズが気になる方は、コードサイズ最適化オプション『-O1』を指定してみるのがいいかもしれないです。一度も使用されない」という警告が表示されていますが、実際にソースコード内で使用していないので、特に気にする必要はありません。エラーがなければコンパイルはできたことになります。』が生成されているはずです。マシン語コードを取り出す出来上がったオブジェクトファイルにはマシン語コードがバイナリ形式で含まれているのでありますが、オブジェクトファイルの中身は構造が複雑なので、単純には取り出せません。そこで、BCCに添付されている『TDUMP』というファイルダンプユーティリティを使います。このユーティリティは、オブジェクトファイルや実行可能ファイルをダンプして、構造を表示するというものです。これを使用して、オブジェクトファイルからマシン語コードの部分の情報を取り出します。コマンドラインツールなので、DOSプロンプト上で実行します。(出力ファイル名)コマンドは上のようになります。オプション指定『-oxCOMENT』は、「COMENTと言う名前のレコードに含まれる情報は含めない」というものです。このレコードには、コメント情報のみが含まれていて、マシン語コードの情報は含まれていないにもかかわらず、この領域の情報は非常に量が多いので、あらかじめ取り除くように指定しておきます。』に結果を出力しなさい、と指定しています。作成されたこのファイルを開くと、以下のようになっています。MODE32上の、色つき表示されている部分では、左側がコードの先頭からのオフセットを、右側の部分がマシン語コードをそれぞれ示しています。これらはどちらも16進数表示になっていることに注意してください。スクリプトを実行した時にマシン語コードがメモリ上にこのように配置されるように、配列変数に値を格納しなければなりません。今回はコードの量がさほど多くないですし(といってもそれなりに多いですが)、今回が初めてであるということもあるので、配列変数に直接書き込んでいくことにします。メモリ管理は「リトルエンディアン方式」と呼ばれ、下位バイトのほうが先に格納されるようになっています。12」の順で格納されるのです。33となっている部分のマシン語コードを配列変数に格納するには、まず、以下のように並べて、これを4バイトずつに区切ってみます。...そして、それをバイトごとに逆転させて、配列変数に格納します。$33333333...1つ注意しておくことは、配列変数の要素数です。バイト)であることを示しています。したがって、これだけのサイズを格納できるように配列変数を確保しておかなければなりません。以下なのであえて確保する必要はありませんが。)スクリプトで使う以上でマシン語コードをメモリ上に格納できたわけです。アドレスを指定すればいいのです。関数を呼び出してウィンドウハンドルが取得できるかというと、そうではありません。11」などとなっていた部分に正しい値を格納しなければなりません。正しい値を格納しましょう。上のコードの場合は、以下のようになります。ハンドルを格納する配列変数のアドレス以上から、全体のスクリプトは次のようになります。"個のウィンドウハンドルが取得されました。