各タイプに応じた関数の作成
以下のような形式で関数を作成してください。
EXPORT BOOL WINAPIはすべてのタイプで共通の宣言です。
また、関数が正常に終了した場合には、必ず「return 0;」のように0を
返してください。ここで、0以外の値を返すとHSPはエラーメッセージを表示
します。
(戻り値の詳細は、「戻り値の設定について」をご覧ください)
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」
がその内容になり、変数の内容を直接書き換えることができます。
文字列型変数や、配列変数の場合はメモリのポインタから先にデータ
が順番に格納されています。文字列であれば、1byte単位で0x0が最後
のデータを表わすCストリング形式(null terminated strings)になって
います。
DLL側から値を返したり、文字列を返す時にはこのタイプを使います。
タイプ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です。
p1は、HSPで使用している画面に関する情報を含むBMSCR構造体が格納
されているメモリへのボインタが入ります。
BMSCR構造体の詳細については別項で解説しています。
タイプ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」のように最初に変数名が記述されて
いることが前提になります。
PVAL構造体の詳細については別項で解説しています。
タイプ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 *)になります。
dpminfoは、DPMファイルやEXEに埋め込まれたファイルにアクセスする場合に
必要になるポインタ値です。dpminfoについての詳細は、HSPサポートルーチンズ
のソースファイル(hspsdk.cpp)を参照してください。
なお、dpminfoのポインタは、システム変数refstrと共用されているので、
dpminfoの値を使って初期化した後は、dpminfoポインタをシステム変数refstr
へ代入するポインタとして自由に使ってかまいません。
タイプ+$30
( p1=??, p2=??, p3=??, p4=rgbptr )
[ test( … , char *p4 ); ]
それぞれのタイプに+$30する(bit4,5を立てる)と、p4のパラメータがなくなり
かわりにp4はHSPのパレットrgbptrへのポインタが渡されます。
つまり、p1,p2,p3のパラメータまではそれぞれのタイプと同じで、p4だけが
rgbptrへのポインタ(char *)になります。
rgbptrは、現在選択されているパレットの内容を指すポインタです。
この内容を書き換えることで、現在のパレットを変更することが可能です。
パレットデータは、rgbptrからR,G,Bの順に1バイトづつ輝度のデータが収められて
おり、これが色の数だけ(通常は256色)続いているだけです。
このデータを書き換えた後は、実際のパレットに反映するためにいくつかの処理を
行なわなければなりません。これについては、HSPサポートルーチンズのソース
ファイル(hspsdk.cpp)を参照してください。
タイプ+$100
それぞれのタイプに+$100する(bit8を立てる)と、その関数はクリーンアップ関数に
指定されます。
クリーンアップ関数は、HSPのプログラムが終了する時に自動的に実行されます。
これは、途中でHSPのプログラムを強制的に終了されたり、エラーで終了した時などに、
DLL側で確保したメモリやリソースが解放されなくなるのを防止するのに有効です。
DLL側でメモリやリソースを初期化しておいても、それを解放するための関数を、この
クリーンアップ関数に指定しておけば、どんな時に終了しても解放ルーチンが呼び
出されることになります。
ただし、解放するルーチン側では、確保される前に呼ばれたり、2度呼び出されても
いいようにチェックを行なっておいてください。
タイプ$202
タイプに$202を指定すると、ver2.6以降専用の新しい呼び出し規約に基づいた
関数として指定されます。
タイプ$202は、パラメーターの解析をプラグインDLLの内部で行ないます。
これにより、パラメーターの組み合わせや数の制限なく値を取得することが可能になります。
ver2.6以降に対応したプラグインを作成される方は、なるべくこのタイプを使って
作成することを推奨致します。
また、HSPの今後のバージョンでもタイプ$202は、継続してサポートする予定です。
タイプ$202は、p1パラメーターとしてHSPEXINFO構造体へのポインタを渡します。
p2,p3,p4のパラメーターは、将来の拡張用で現在は未使用です。
HSPEXINFO構造体には、HSPから取得できる情報や、関数群がすべて収められています。
typedef struct HSPEXINFO
{
// HSP internal info data (2.6)
//
short ver; // Version Code
short min; // Minor Version
//
int *er; // Parameter Error Flag
char *pstr; // String Buffer (master)
char *stmp; // String Buffer (sub)
PVAL2 **pval; // Master PVAL ptr.
//
int *actscr; // Active Window ID
int *nptype; // Next Parameter Type
int *npval; // Next Parameter Value
int *strsize; // StrSize Buffer
char *refstr; // RefStr Buffer
//
int (*HspFunc_prm_getv)( void );
int (*HspFunc_prm_geti)( void );
int (*HspFunc_prm_getdi)( int defval );
char *(*HspFunc_prm_gets)( void );
char *(*HspFunc_prm_getds)( char *defstr );
int (*HspFunc_val_realloc)( PVAL2 *pv, int size, int mode );
int (*HspFunc_fread)( char *fname, void *readmem, int rlen, int seekofs );
int (*HspFunc_fsize)( char *fname );
void *(*HspFunc_getbmscr)( int wid );
int (*HspFunc_getobj)( int wid, int id, HSPOBJINFO *inf );
int (*HspFunc_setobj)( int wid, int id, HSPOBJINFO *inf );
//
} HSPEXINFO;
タイプ$202は、パラメーターの取得をユーザーの関数内で行ないます。
HSPSDK/SAMPLEディレクトリに、いくつかタイプ$202のサンプルがありますので、 そちらも参照してください。
以下は、整数値を3つ取得する例です。
EXPORT BOOL WINAPI test( HSPEXINFO *hei, int p1, int p2, int p3 )
{
// DLL test (type$202)
int ep1,ep2,ep3;
ep2 = hei->HspFunc_prm_getdi(0); // パラメータ1:数値
ep3 = hei->HspFunc_prm_getdi(0); // パラメータ2:数値
ep4 = hei->HspFunc_prm_getdi(0); // パラメータ3:数値
if ( *hei->er ) return *hei->er; // エラーチェック
return 0;
}
HspFunc_prm_getdi関数により、32bit整数値を取得することができます。
また、引数としてデフォルトの数値を指定することができます。
デフォルト数値を許さない場合は、HspFunc_prm_geti関数を使用してください。
HspFunc_prm_getdiの返り値が、実際のパラメーターとなります。
パラメーターは、何個でも連続して取得することができます。
必要なパラメーターを取得したら、最後にエラーチェックを行なう必要があります。
HSPEXINFOの「*er」メンバの内容が0ならば、パラメーター取得中にエラーは発生していません。
内容が0以外の場合は、それをそのままreturn値にして戻って下さい。エラーが報告されます。
エラーチェックを行なわないと、エラーが表示されなかったり、動作がおかしくなる可能性があるので、忘れずに入れるようにしてください。
以下は、文字列や変数を取得する例です。
EXPORT BOOL WINAPI test( HSPEXINFO *hei, int p1, int p2, int p3 )
{
// DLL test (type$202)
PVAL2 *pval;
char *ep1;
char *ep2;
ep1 = (char *)hei->HspFunc_prm_getv(); // パラメータ1:変数
pval = *hei->pval; // 変数のPVAL2ポインタを取得
ep2 = hei->HspFunc_prm_gets(); // パラメータ2:文字列
if ( *hei->er ) return *hei->er; // エラーチェック
return 0;
}
HspFunc_prm_getv関数は、変数のポインタを取得します。
HSPEXINFOの「*pval」メンバに取得した変数のPVALポインタが代入されます。
また、HspFunc_prm_getv関数自体の戻り値には、変数のデータそのもののポインタが入ります。
もし、配列変数を指定していた場合は、指定した配列のデータポインタが返ります。
たとえば、「a.2」という変数が指定されている場合は、PVALポインタは変数aそのもののPVAL情報になり、
HspFunc_prm_getv関数の返り値は、「a.2」のデータそのものが格納されているポインタとなります。
また、HspFunc_prm_gets関数は、文字列のパラメーターを取得します。
HspFunc_prm_gets関数の返り値は、文字列データへのポインタになります。
注意しなければならないのは、ここで返される文字列データへのポインタは、
HSP内部の一時的な文字列バッファであり、内容がずっと保持されるわけではありません。
たとえば、HspFunc_prm_gets関数の後に、もう一度HspFunc_prm_gets関数を
呼び出せば、前の文字列バッファの内容は新しい文字列で上書きされてしまいます。
このため、文字列データを2つ以上取得したい場合には、最初の文字列データをあらかじめコピーして保存しておく必要があります。
文字列は最大で64K(65536byte)まで渡される可能性があります。
また、文字列をコピーして保存しておくエリアとしてHSPEXINFOの「stmp」を
使用することができます。
ちなみに、デフォルトの文字列を設定できるHspFunc_prm_getds関数も同様の
動作を行ないます。
HSPEXINFO構造体の詳細は、以下の通りです。
short ver; // Version Code
HSPのバージョンコードが入ります。2.6の場合は、0x0206となります。
short min; // Minor Version
HSPのマイナーバージョン番号が入ります。
int *er; // Parameter Error Flag
エラーチェック用のフラグ値
char *pstr; // String Buffer (master)
HspFunc_prm_gets、HspFunc_prm_getds関数で取得される文字列バッファ。(64K)
char *stmp; // String Buffer (sub)
文字列バッファのコピー用に用意されたテンポラリメモリ(64K)。
PVAL2 **pval; // Master PVAL ptr.
HspFunc_prm_getvで取得される変数のPVALポインタ。
int *actscr; // Active Window ID
現在の操作先ウインドゥID。
int *nptype; // Next Parameter Type
次のパラメーターのタイプを示す変数のポインタです。
*nptype値が、0の場合は記号、1は数値、2は文字列、3はラベル名、4は変数名を示しています。
int *npval; // Next Parameter Value
次のパラメーターのタイプに対応した値を示す変数のポインタです。
*npval値は、タイプ(nptype)に対応した値が代入されます。
int *strsize; // StrSize Buffer
システム変数strsizeへのポインタが格納されます。
char *refstr; // RefStr Buffer
システム変数refstrへのポインタが格納されます。
int (*HspFunc_prm_getv)( void );
パラメーター取得用関数。変数ポインタを取得する。
返値は、変数のデータポインタ。
int (*HspFunc_prm_geti)( void );
パラメーター取得用関数。整数値を取得する。
返値は取得した値。
int (*HspFunc_prm_getdi)( int defval );
パラメーター取得用関数。整数値を取得する。
defvalでデフォルトの値を設定する。
返値は取得した値。
char *(*HspFunc_prm_gets)( void );
パラメーター取得用関数。文字列を取得する。
返値は取得した文字列ポインタ。
char *(*HspFunc_prm_getds)( char *defstr );
パラメーター取得用関数。文字列を取得する。
defstrでデフォルトの文字列を設定する。
返値は取得した文字列ポインタ。
int (*HspFunc_val_realloc)( PVAL2 *pv, int size, int mode );
pvで指定PVALポインタの変数バッファを、sizeで指定したメモリサイズに変更する。
modeが0の場合は、メモリ空間を0で初期化、modeが1の場合は内容は変更せずにバッファサイズのみ変更します。
int (*HspFunc_fread)( char *fname, void *readmem, int rlen, int seekofs );
fnameで指定したファイル名の内容を、readmemポインタのメモリに読み込みます。
rlenで読み込むサイズ(バイト単位)、seekofsで読み込み開始オフセット(先頭から何バイト目か)を設定することができます。
PACKFILEに格納されているファイルや、暗号化されたファイルを取り出すことが可能です。
返値は実際に読み込まれたサイズとなります。ファイルがなかった場合は、マイナス値が返ります。
int (*HspFunc_fsize)( char *fname );
fnameで指定したファイルのサイズを返します。
ファイルがなかった場合は、マイナス値が返ります。
void *(*HspFunc_getbmscr)( int wid );
widで指定したウインドゥIDのBMSCR構造体ポインタを返値として取得します。
int (*HspFunc_getobj)( int wid, int id, HSPOBJINFO *inf );
widで指定したウインドゥID内の、idで指定したオブジェクトIDの情報を
HSPOBJINFO構造体に取得します。
正常に取得された場合は、0が返されます。
int (*HspFunc_setobj)( int wid, int id, HSPOBJINFO *inf );
widで指定したウインドゥID内の、idで指定したオブジェクトIDの情報を
HSPOBJINFO構造体から設定します。
正常に設定された場合は、0が返されます。
HSP ver2.6でサポートされている引数のタイプは以上ですべてです。