外部関数の呼び出し(可変長引数版)
val = cfunc64(p1, p2, p3...)
p1 : 戻り値の型(REF_XX マクロ) p2 : 関数アドレス(64bit値) または 外部拡張命令(#func,#cfuncで定義されているDLL呼び出し用の命令/関数) p3以降 : 関数へ渡す引数(可変長引数)
(プラグイン / モジュール : hspint64.dll)
p2で指定されている関数アドレス(64bit値) をネイティブな関数として呼び出します。 callfuncやcallfunc64iと違い、関数に渡す引数情報は可変長引数で渡すことができ、配列変数に引数情報を入れる必要がありません。 p1 は関数の戻り値の型を指定します。以下が指定可能です。
RET_VOID : void 型 RET_INT : int型 RET_INT64 : int64型 RET_DOUBLE : double型 RET_FLOAT : float型 RET_FLOAT_INT : float値をint型変数にキャスト ※1 RET_STR : 文字列型 RET_STRW : Unicode文字列型(UTF-16)
p2 には関数アドレス(64bit値) または 外部拡張命令(#func,#cfuncで定義されているDLL呼び出し用の命令/関数)を指定します。 p3 以降に関数へ渡す引数を指定します。 例えば、MessageBoxW の場合、渡すべき引数は4つありますが、p3 以降に直接引数として指定可能です。 型の情報を見て関数を呼び出しますので、Unicode(UTF-16)を要求する引数の場合は、strwや_T()などでUnicode文字列として変換した状態にしてください。 本命令がサポートしている引数の型は、int,str,double,int64,float,strw です。 #func, #cfunc に近い引数の型をサポートしていますが、var はサポートしていません。変数にvarptr64()を使用してポインタを渡してください。 例1 : ------------------------------------------------------------------------------------- #uselib "user32.dll" #func MessageBoxW "MessageBoxW" sptr,sptr,sptr,sptr #define MB_ICONINFORMATION $40 #define MB_OK 0 // 問題なし mes cfunc64( RET_INT, MessageBoxW, hwnd, _T("Hello!"), _T("Test"), MB_OK | MB_ICONINFORMATION) // 文字化けします(UTF-16で渡す必要があるのにしていないため) mes cfunc64( RET_INT, MessageBoxW, hwnd, "Hello!", "Test" MB_OK | MB_ICONINFORMATION) ------------------------------------------------------------------------------------- Windows APIの一部に引数に構造体のポインタ渡しではなく、値渡しをする関数がありますが、参考としてWindowFromPointの例を記載します。 例2 : ------------------------------------------------------------------------------------- // 構造体の値渡しの例(POINT構造体の場合) #uselib "user32.dll" #func WindowFromPoint "WindowFromPoint" int, int title "マウスカーソル下のウィンドウハンドルを表示します" // 64bit pt = int64(0) repeat // 画面消去 pos 0,0 : color 255,255,255 : boxf : color // 32bit版だと引数が2つになりますが、64bit版の場合はPOINT構造体が64bitで収まるので、1つとして渡します。 lpoke pt, 0, ginfo_mx lpoke pt, 4, ginfo_my mes "HWND -> " + cfunc64( RET_INT64, WindowFromPoint, pt) // 下記は失敗します // mes "HWND -> " + cfunc64( RET_INT64, WindowFromPoint, ginfo_mx, ginfo_my) wait 12 loop ------------------------------------------------------------------------------------- なお、p1 に指定する型指定を不要にした版の関数・命令もあります。 cfunc64v 命令(void 型) cfunc64i 関数(int型) cfunc64i64 関数(int64型) cfunc64d 関数(double型) cfunc64f 関数(float型) cfunc64fi 関数(float値をint型変数にキャスト) cfunc64s 関数(文字列型) cfunc64sw 関数(Unicode文字列型(UTF-16)) を参照してください。 ※1 flaot(intキャスト)とは、int型の変数にfloat値を直接格納したものになります。 double型に変換する場合は、以下Webサイトの変換モジュールが必要です。 http://spn.php.xdomain.jp/hsp_koneta3.htm#tofloat
#uselib "kernel32.dll" #func LoadLibrary "LoadLibraryW" #func GetProcAddress "GetProcAddress" #uselib "user32.dll" #func MessageBoxA "MessageBoxA" #func MessageBoxW "MessageBoxW" #define MB_ICONINFORMATION $40 #define MB_OK 0 // その1 hModule = cfunc64( RET_INT64, LoadLibrary, _T("user32.dll")) pMessageBoxW = cfunc64( RET_INT64, GetProcAddress, hModule, "MessageBoxW") mes cfunc64( RET_INT, pMessageBoxW, hwnd, _T("Hello!"), _T("Test1"), MB_OK | MB_ICONINFORMATION) // その2 mes cfunc64( RET_INT, varptr(MessageBoxW), hwnd, _T("Hello!"), _T("Test2"), MB_OK | MB_ICONINFORMATION) // その3 mes cfunc64( RET_INT, MessageBoxW, hwnd, _T("Hello!"), _T("Test3"), MB_OK | MB_ICONINFORMATION) // その4 (一番簡単) mes cfunc64i( MessageBoxW, hwnd, _T("Hello!"), _T("Test4"), MB_OK | MB_ICONINFORMATION)
callfunc64i | 外部関数の呼び出し(戻り値int64型) | (hspint64.dll) |
callfunc64d | 外部関数の呼び出し(戻り値double型) | (hspint64.dll) |
callfunc64f | 外部関数の呼び出し(戻り値float(intキャスト)型) | (hspint64.dll) |
cfunc64v | 外部関数の呼び出し(可変長引数版)(戻り値:void型) | (hspint64.dll) |
cfunc64i | 外部関数の呼び出し(可変長引数版)(戻り値:int型) | (hspint64.dll) |
cfunc64i64 | 外部関数の呼び出し(可変長引数版)(戻り値:int64型) | (hspint64.dll) |
cfunc64d | 外部関数の呼び出し(可変長引数版)(戻り値:double型) | (hspint64.dll) |
cfunc64f | 外部関数の呼び出し(可変長引数版)(戻り値:float型) | (hspint64.dll) |
cfunc64fi | 外部関数の呼び出し(可変長引数版)(戻り値:float(intキャスト)型) | (hspint64.dll) |
cfunc64s | 外部関数の呼び出し(可変長引数版)(戻り値:文字列型) | (hspint64.dll) |
cfunc64sw | 外部関数の呼び出し(可変長引数版)(戻り値:Unicode(UTF-16)文字列型) | (hspint64.dll) |
callfunc | 外部関数の呼び出し | |
RET_VOID | 戻り値:void型 | (hspint64.dll) |
RET_INT | 戻り値:int型 | (hspint64.dll) |
RET_INT64 | 戻り値:int64型 | (hspint64.dll) |
RET_DOUBLE | 戻り値:double型 | (hspint64.dll) |
RET_FLOAT | 戻り値:float型 | (hspint64.dll) |
RET_FLOAT_INT | 戻り値:float(intキャスト)型 | (hspint64.dll) |
RET_STR | 戻り値:文字列型 | (hspint64.dll) |
RET_STRW | 戻り値:Unicode(UTF-16)文字列型 | (hspint64.dll) |
プラグイン / モジュール | hspint64.dll |
バージョン | 1.03 |
作成日 | 2021/06/13 |
著作者 | inovia |
URL | https://hsp.moe/ |
備考 | #include "hsp3_64.as"
#include "hspint64.as" 以上2つのファイルをインクルードすること。 (ソースコード上の記述個所は一番上を推奨) |
タイプ | int64型拡張プラグイン |
グループ | callfunc |
対応環境 |
|
移植のヒント | 64bit版 Windows のみ |
hs ファイル | hsphelp\hspint64.hs |