外部関数の呼び出し(可変長引数版)
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 |