sample\hspint64.dll\43_戻り値が構造体の値渡しの場合.hsp » Plain Format
// hsp3_64.as → hspint64.as の順にインクルードしてください。
// また、varptr や callfunc をマクロで置き換えている都合上、
// hspint64.as のインクルードは なるべく上に書いておくことをお勧めします。
// なお、varptr や callfunc をマクロの置換をしない場合は、以下のコメントを解除してください。
// #define CANCEL_UNDEF_HSPINT64
#include "hsp3_64.as"
#include "hspint64.as"
// ----------------------------------------------------------
// 戻り値が構造体の値渡しの場合
// ----------------------------------------------------------
// Win32APIでは見たことがありませんが、DXライブラリなどは
// 戻り値が構造体の値渡しになっているケースがあります。
// その場合の呼び出し方の例です。
// ※ Win32APIなどでよくある戻り値が構造体のポインタの場合は、cfunc64i64() の戻り値をdupptrなどで参照してください。
// ----------------------------------------------------------
// RECT構造体
// typedef struct tagRECT
// {
// LONG left;
// LONG top;
// LONG right;
// LONG bottom;
// } RECT;
// C言語関数
// RECT Test_Ret_RECT(void)
// {
// static RECT rc = { 0x12, 0x34, 0x56, 0x78 };
// return rc;
// }
#uselib "hspint64.dll"
#func Test_Ret_RECT "Test_Ret_RECT"
// hspint64.dll にテスト用の関数を用意しています。
// Test_Ret_RECT 関数で、引数は 0 個で、
// 戻り値がRECT構造体の値渡しになっています。
//
// HSPから呼び出す際は、C言語側の定義では本来引数はありませんが、
// HSP側で戻り値用の構造体のメモリを用意して第1引数にポインタを渡す必要があります。
dim rect, 4
cfunc64v Test_Ret_RECT, varptr(rect)
mes strf("left = 0x%02x", rect(0))
mes strf("top = 0x%02x", rect(1))
mes strf("right = 0x%02x", rect(2))
mes strf("bottom = 0x%02x", rect(3))