#uselib "filename" 外部DLLの指定HSPから呼び出す外部DLLのファイル名を指定します。
#func 新規名称 関数名 タイプ 外部DLL呼び出し命令登録外部DLLを呼び出すための新しい命令をコンパイラに登録します。
新規命令 p1,p2,p3,p4のようにパラメータを4つまで渡すことのできる命令となります。
(p1〜p3までのパラメータ) タイプ0 : 新規命令 p1,p2,p3,p4 ( p1=int, p2=int, p3=int ) タイプ1 : 新規命令 p1,p2,p3,p4 ( p1=変数バッファへのポインタ, p2=int, p3=int ) タイプ2 : 新規命令 p2,p3,p4 ( p1=BMSCR構造体へのポインタ, p2=int, p3=int ) タイプ3 : 新規命令 p1,p2,p3,p4 ( p1=変数情報PVAL構造体へのポインタ, p2=int, p3=int ) タイプ4 : 新規命令 p2,p3,p4 ( p1=int, p2=str, p3=int ) タイプ5 : 新規命令 p1,p2,p3,p4 ( p1=変数バッファへのポインタ, p2=str, p3=int ) タイプ6 : 新規命令 p2,p3,p4 ( p1=BMSCR構造体へのポインタ, p2=str, p3=int ) タイプ7 : 新規命令 p1,p2,p3,p4 ( p1=変数情報PVAL構造体へのポインタ, p2=str, p3=int ) タイプ$83 : 新規命令 p1,p2,p3,p4 ( p1=変数情報PVAL2構造体へのポインタ, p2=int, p3=int ) タイプ$87 : 新規命令 p1,p2,p3,p4 ( p1=変数情報PVAL構造体へのポインタ, p2=str, p3=int ) (p4のパラメータ) 各タイプ+$00 : p4=int 各タイプ+$10 : p4=システム変数refstrへのポインタ 各タイプ+$20 : p4=ファイルハンドルdpminfoへのポインタ 各タイプ+$30 : p4=パレットデータrgbptrへのポインタ (その他) 各タイプ+$100 : HSP終了時に自動的に呼び出される関数 (クリーンアップ関数)の指定パラメータの表記で、intは数値、strは文字列となります。 intのパラメータが省略されている場合は、0がDLLに渡されます。 それ以外のパラメータの省略はできません。 p1が、BMSCR構造体へのポインタの場合はパラメータの数が1つ少なく なるので注意してください。
1.Visual C++で 新規作成 -> Win32 Dynamic-Link Library を選択、
新しいプロジェクトを作成します。
2.CまたはC++のソースファイルを作成して、プロジェクトに追加します。
3.HSPのDLLを作るためのヘッダファイル「hspdll.h」をインクルードして
ください。
4.タイプに応じた関数を作成して、その関数をEXPORTマクロでエクスポート
関数に指定します。
5.コンパイルしてDLLを作成します。
6.HSPで呼び出すための、#uselibと#funcを記述したテスト用のスクリプト
を作成して、呼び出せるかどうか確認してみる。
7.うまくいったら、あとはデバッグして完成。
もし、正常にリンクできなかったり、エクスポートできない場合は関数名
の指定の大小文字や、エクスポート名のチェックなどをしてみてください。
DLLにどんな名前がエクスポートされているかは、VC++付属のツールDUMPBIN
で確認することができます。「_関数名@16」という名前でエクスポートされ
ていれば正常です。
1.新規作成でDLL(ダイナミックリンクライブラリ)を選択、
新しいプロジェクトを作成します。
2.CまたはC++のソースファイルを作成して、プロジェクトに追加します。
3.HSPのDLLを作るためのヘッダファイル「hspdll.h」をインクルードして
ください。
4. DLL関数のエクスポート名を定義するための定義ファイル(DEFファイル)を
作成してください。
5.定義ファイル(DEFファイル)をプロジェクトに追加します。
6.タイプに応じた関数を作成して、その関数をEXPORTマクロでエクスポート
関数に指定します。(VC++での作成方法と同じです)
7.コンパイルしてDLLを作成します。
8.HSPで呼び出すための、#uselibと#funcを記述したテスト用のスクリプト
を作成して、呼び出せるかどうか確認してみる。
9.うまくいったら、あとはデバッグして完成。
一番問題となるのは、標準で出力されるC++ Builderのエクスポート関数名が、
VC++と異なっているため、HSPから関数名の認識ができなくなることです。
これを解決するために、モジュール定義ファイル(DEFファイル)を作成して、
それをプロジェクトに追加することで正常に認識されるようになります。
DEFファイルは、たとえば以下のように記述します。
EXPORTS _testfunc@16=testfunc上の例は、「testfunc」という名前の関数名を、「_testfunc@16」という 名前で外部にエクスポートするための定義です。HSPで認識されるためには、 「_関数名@16」という名前である必要があります。 このDEFファイルで、エクスポート関数名を定義することにより、HSPから 呼び出されるDLLを作成することが可能になります。
1.VCLを使わない時は、makファイル内のALLLIB行にあるvcl.lib を削除、
そしてcp32mt.lib を cw32mt.libに変更する。
さらに、最初にインクルード指定されている「#include 」
を削除し、かわりに「#include 」を記述する。
2.C++ Builder 3.0の場合は2.のmakファイルがbprファイルになっている
ので注意が必要です。また、bprファイル内のALLOBJ行にある、
「sysinit.obj も削除してください。
3.マルチスレッドを使用しない場合は、リンクするライブラリをcw32mt.lib
ではなくcw32.libにすることで、さらに少しサイズの節約ができます。
4.最終コンパイル時は、プロジェクトオプションのスピードを「リリース」
のモードにしておく。
EXPORT BOOL WINAPI test ( int p1, int p2, int p3, int p4 )
{
// start
// :
// end
return 0;
}
タイプ0 : 新規命令 p1,p2,p3,p4
( p1=int, p2=int, p3=int, p4=int )
[ test( int p1, int p2, int p3, int p4 ); ]
このタイプは、intの引数4つが渡されます。すべて32bit signed int
です。値が省略されている場合は0が渡されます。
タイプ1 : 新規命令 p1,p2,p3,p4
( p1=変数バッファへのポインタ, p2=int, p3=int, p4=int )
[ test( void *p1, int p2, int p3, int p4 ); ]
このタイプは、p2〜p4まではタイプ0と同じ32bit signed intです。
p1だけは、変数のバッファへのポインタになります。つまり、HSP側
では、「test a,2,3,5」のように最初に変数名が記述されていることが
前提になります。p1には、指定された変数の内容が格納されている
メモリへのポインタが入ります。数値型変数であれば、「*(int *)p1」
がその内容になり、変数の内容を直接書き換えることができます。
タイプ2 : 新規命令 p2,p3,p4
( p1=BMSCR構造体へのポインタ, p2=int, p3=int, p4=int )
[ test( BMSCR *p1, int p2, int p3, int p4 ); ]
このタイプは、HSP側ではp2〜p4までの3つのパラメータを取ります。
p2〜p4はタイプ0と同じ32bit signed intです。
タイプ3 : 新規命令 p1,p2,p3,p4
( p1=変数のPVAL構造体へのポインタ, p2=int, p3=int, p4=int )
[ test( PVAL *p1, int p2, int p3, int p4 ); ]
タイプ$83 : 新規命令 p1,p2,p3,p4
( p1=変数情報PVAL2構造体へのポインタ, p2=int, p3=int )
[ test( PVAL2 *p1, int p2, int p3, int p4 ); ]
このタイプは、p2〜p4まではタイプ0と同じ32bit signed intです。
p1だけは、指定した変数の情報を格納する構造体(PVALまたはPVAL2)
へのポインタになります。
HSP側では、「test a,2,3,5」のように最初に変数名が記述されて
いることが前提になります。
タイプ4 : 新規命令 p1,p2,p3,p4
( p1=int, p2=str, p3=int, p4=int )
[ test( int p1, char *p2, int p3, int p4 ); ]
タイプ5 : 新規命令 p1,p2,p3,p4
( p1=変数バッファへのポインタ, p2=str, p3=int, p4=int )
[ test( void *p1, char *p2, int p3, int p4 ); ]
タイプ6 : 新規命令 p2,p3,p4
( p1=BMSCR構造体へのポインタ, p2=str, p3=int, p4=int )
[ test( BMSCR *p1, char *p2, int p3, int p4 ); ]
タイプ7 : 新規命令 p1,p2,p3,p4
( p1=変数のPVAL構造体へのポインタ, p2=str, p3=int, p4=int )
[ test( PVAL *p1, char *p2, int p3, int p4 ); ]
タイプ$87 : 新規命令 p1,p2,p3,p4
( p1=変数情報PVAL2構造体へのポインタ, p2=str, p3=int )
[ test( PVAL2 *p1, char *p2, int p3, int p4 ); ]
これは、タイプ0〜3のp2パラメータが文字列になったものです。
p2には、文字列データへのポインタが渡されることになります。
タイプ+$10
( p1=??, p2=??, p3=??, p4=refstr )
[ test( … , char *p4 ); ]
それぞれのタイプに+$10する(bit4を立てる)と、p4のパラメータがなくなり
かわりにp4はシステム変数refstrへのポインタが渡されます。
つまり、p1,p2,p3のパラメータまではそれぞれのタイプと同じで、p4だけが
システム変数refstrへのポインタ(char *)になります。
これは、結果を文字列としてシステム変数に返したい時などに使用します。
(システム変数refstrには、4096文字までの文字列しか代入できませんので注意してください)
タイプ+$20
( p1=??, p2=??, p3=??, p4=dpminfo )
[ test( … , char *p4 ); ]
それぞれのタイプに+$20する(bit5を立てる)と、p4のパラメータがなくなり
かわりにp4はHSPのファイルシステム値dpminfoへのポインタが渡されます。
つまり、p1,p2,p3のパラメータまではそれぞれのタイプと同じで、p4だけが
dpminfoへのポインタ(char *)になります。
タイプ+$30
( p1=??, p2=??, p3=??, p4=rgbptr )
[ test( … , char *p4 ); ]
それぞれのタイプに+$30する(bit4,5を立てる)と、p4のパラメータがなくなり
かわりにp4はHSPのパレットrgbptrへのポインタが渡されます。
つまり、p1,p2,p3のパラメータまではそれぞれのタイプと同じで、p4だけが
rgbptrへのポインタ(char *)になります。
タイプ+$100それぞれのタイプに+$100する(bit8を立てる)と、その関数はクリーンアップ関数に 指定されます。 クリーンアップ関数は、HSPのプログラムが終了する時に自動的に実行されます。 これは、途中でHSPのプログラムを強制的に終了されたり、エラーで終了した時などに、 DLL側で確保したメモリやリソースが解放されなくなるのを防止するのに有効です。 DLL側でメモリやリソースを初期化しておいても、それを解放するための関数を、この クリーンアップ関数に指定しておけば、どんな時に終了しても解放ルーチンが呼び 出されることになります。 ただし、解放するルーチン側では、確保される前に呼ばれたり、2度呼び出されても いいようにチェックを行なっておいてください。
| 戻り値 | 行なわれる処理 |
| 0 | 正常終了 |
| -1以下 | システム変数statに戻り値を代入して終了 |
| 1〜255 | エラーを表示して停止 |
| 0x10000〜0x1ffff | 終了後awaitを実行 |
| 0x20000〜0x3ffff | 終了後waitを実行 |
呼び出しタイプ3,7 = PVAL構造体 ( ver2.4g以降で使用できるもの ) 呼び出しタイプ$83,$87 = PVAL2構造体 ( ver2.5以降で使用できるもの )HSP ver2.5より以前のバージョンで動作させるためには、PVAL構造体を 使用してください。ver2.5では、PVAL構造体、PVAL2構造体ともに使用する ことができますが、なるべく新しい形式(PVAL2構造体)に対応したものを 推奨します。
typedef struct PVAL2
{
// Memory Val structure (ver2.5 Type)
//
short flag; // type of val
short mode; // mode (0=normal/1=clone/2=alloced)
int len[5]; // length of array 4byte align (dim)
int size; // size of Val (not used)
char *pt; // (direct val) or (ptr to array)
} PVAL2;
typedef struct PVAL
{
// Memory Val structure (Old Type)
//
short flag; // type of val
short mode; // mode (0=normal/1=clone/2=alloced)
short len[5]; // length of array 4byte align (dim)
short version; // version check code (2.4 = 0)
char *pt; // (direct val) or (ptr to array)
PVAL2 *realptr; // real ptr to ver2.5 PVAL
} PVAL;
それぞれのメンバには、HSPが管理する変数についての情報が
格納されています。1つの変数名につき1つのPVAL構造体が存在します。
これには、変数の持つ属性や型などすべての情報が格納されています。
DLLでは、これらの値を自由に書き換えて使用することが可能です。
short flag; // type of val (2=str/4=num)変数の型が格納されています。
short mode; // mode (0=normal/1=clone/2=alloced)変数が作成されたモードが格納されています。
int len[5]; // length of array 4byte align (dim)配列のサイズについての情報が格納されています。
char *pt; // ptr to Val実際の変数の内容が記憶されているメモリへのポインタです。
int size; // size of Val (not used)変数が使用しているメモリサイズの合計です(未使用)。
short version; // version check code (2.4 = 0) PVAL2 *realptr; // real ptr to ver2.5 PVALバージョンチェックのためのフィールドです(PVAL構造体のみ)。
#define objkazz 64
typedef struct BMSCR
{
// Bitmap buffer structure
//
int flag; // used flag
int sx; // X-size
int sy; // Y-size
int palmode; // palmode
HDC hdc; // buffer HDC
BYTE *pBit; // bitmap pointer
BITMAPINFOHEADER *pbi; // infoheader
HBITMAP dib; // bitmap handle(DIB)
HBITMAP old; // bitmap handle(OLD)
RGBQUAD *pal; // palette table
HPALETTE hpal; // palette handle
HPALETTE holdpal; // palette handle (old)
int pals; // palette entries
HWND hwnd; // window handle
HANDLE hInst; // Instance of program
int infsize; // *pbi alloc memory size
int bmpsize; // *pBit alloc memory size
// Window object setting
//
int type; // setting type
int wid; // window ID
short fl_dispw; // display window flag
short fl_udraw; // update draw window
int wx,wy,wchg; // actual window size x,y
int xx,yy; // buffer view point x,y
int lx,ly; // buffer view size x,y
int cx,cy; // object cursor x,y
int ox,oy,py; // object size x,y,py
int texty; // text Y-axis size
int gx,gy,gmode; // gcopy size
HBRUSH hbr; // BRUSH handle
HPEN hpn; // PEN handle
HFONT hfont; // FONT handle
HFONT holdfon; // FONT handle (old)
COLORREF color; // text color code
HANDLE hCld[objkazz]; // buttonのhandle
int owid[objkazz]; // buttonのjump ID
int owb; // handleのindex
int textspeed; // slow text speed
int cx2,cy2; // slow text cursor x,y
int tex,tey; // slow text limit x,y
char *prtmes; // slow message ptr
} BMSCR;
それぞれのメンバには、HSPが管理するウインドゥ画面についての情報が
格納されています。DLLに、BMSCR構造体へのポインタが渡される場合は、
現在の操作先画面(gsel命令で指定したウインドゥID)の情報が渡されます。
int flag; // used flagBMSCRが管理する画面が使用されているかどうかのフラグです。
int sx; // X-size int sy; // Y-size int palmode; // palmode画面を初期化したサイズが格納されています。
HDC hdc; // buffer HDC画面のデバイスコンテキストが格納されています。
BYTE *pBit; // bitmap pointer画面のビットマップデータが格納されているメモリの先頭アドレスです。 このポインタを使って直接、画面にデータを書き込むことが可能です。
BITMAPINFOHEADER *pbi; // infoheader HBITMAP dib; // bitmap handle(DIB) HBITMAP old; // bitmap handle(OLD)画面データを管理するビットマップについての情報です。
RGBQUAD *pal; // palette table HPALETTE hpal; // palette handle HPALETTE holdpal; // palette handle (old) int pals; // palette entries画面に適用されているパレットの情報です。
HWND hwnd; // window handle画面の描画先にあたるウインドゥのハンドルです。
HANDLE hInst; // Instance of programウインドゥを管理するプログラムためのインスタンスです。
int infsize; // *pbi alloc memory size int bmpsize; // *pBit alloc memory size画面データ初期化時のメモリ使用量を示すワークです。
int type; // setting type画面の属性を示します。
type : 1=off screen buffer 2=background image (full size) 3=hsp main window (fixed size) 4=normal window (fixed size) 5=picture window (flex size) 6=special window (stretch) 7=screen saver preview window
int wid; // window IDウインドゥIDを示します。
short fl_dispw; // display window flag short fl_udraw; // update draw window画面がウインドゥとして表示されているかどうか、 画面の更新が必要かどうかを示すフラグです。
int wx,wy,wchg; // actual window size x,y int xx,yy; // buffer view point x,y int lx,ly; // buffer view size x,yスクロールバーによってスクロールが可能なウインドゥでの、 表示ウインドゥサイズ、画面内から転送する元座標、転送する範囲 などを示します。
int cx,cy; // object cursor x,yカレントポジションを示します。
int ox,oy,py; // object size x,y,pyobjsize命令で指定したオブジェクトの大きさを示します。
int texty; // text Y-axis size現在選択されている文字フォントのY方向のサイズを示します。
int gx,gy,gmode; // gcopy sizegmode命令で指定した画面コピー時のサイズとモードを示します。
HBRUSH hbr; // BRUSH handle HPEN hpn; // PEN handlecolor命令で指定した色によるブラシとペンを示すオブジェクトの ハンドルです。
HFONT hfont; // FONT handle HFONT holdfon; // FONT handle (old)font命令で指定したフォントのオブジェクトハンドルです。
COLORREF color; // text color codecolor命令で指定した色データを示します。
HANDLE hCld[objkazz]; // buttonのhandle int owid[objkazz]; // buttonのjump ID int owb; // handleのindex画面上に配置するHSPのオブジェクト(ボタンや入力ボックスなど) に関する情報が格納されています。hCld[n]はオブジェクトハンドル、 owid[n]は各種情報を示しています。(nはオブジェクトID)
int textspeed; // slow text speedtext命令で指定したテキストの表示スピードを示します。
int cx2,cy2; // slow text cursor x,y int tex,tey; // slow text limit x,y char *prtmes; // slow message ptrゆっくりと文字列を表示するためのワークです。
(パレットモード(256色)時) x = X座標; y = Y座標; vram_adr = pBit + ( ( sy - 1 - y ) * sx ) + x; (フルカラーモード(1670万色)時) x = X座標; y = Y座標; vram_adr = pBit + ( ( sy - 1 - y ) * sx * 3 ) + ( x * 3 );
[一番上に戻る]