cfunc64

外部関数の呼び出し(可変長引数版)

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)

サンプル逆引き (2)

41_cfunc64系.hsp
42_引数が構造体の値渡しの場合.hsp

情報

プラグイン / モジュールhspint64.dll
バージョン1.03
作成日2021/06/13
著作者inovia
URLhttps://hsp.moe/
備考#include "hsp3_64.as"
#include "hspint64.as"
以上2つのファイルをインクルードすること。
(ソースコード上の記述個所は一番上を推奨)
タイプint64型拡張プラグイン
グループcallfunc
対応環境
  • Windows 版 HSP
移植のヒント64bit版 Windows のみ
hs ファイルhsphelp\hspint64.hs