←HSPハック トップへ

HSPの命令を関数としても使えるようにする

ちょっとした裏技。

最終更新:2017/11/18

初版:2017/11/18




はじめに


HSP3.5になって、外部DLL呼び出し命令登録したものは関数としても使えるようになりましたが、HSP標準命令は関数としても使えないので関数化させようと思います。
今回は、関数としても使いたいsendmsg命令を関数化します。

1.正攻法 … 関数を新たに作る


f_sendmsgという関数を作ります。

WM_GETTEXTLENGTHで、タイトルバーの文字数を取得するサンプル)
#module
#defcfunc f_sendmsg int hnd, int msg, int wp, int lp
	sendmsg hnd, msg, wp, lp
return stat
#global

sendmsg hwnd,0x000C/*WM_SETTEXT*/,0,"12345"
mes f_sendmsg(hwnd,0x000E/*WM_GETTEXTLENGTH*/,0,0)
名前が変わるところが気に入りませんね... (筆者個人の感想です。)

2.裏技 … 命令を乗っ取る


sendmsgの定義を取り消してダミーDLLの命令として登録し、関数アドレスをコールバック関数のポインタに変更する、強引な方法です。
※ちょくと氏のhscallbk.dllが必要です。
#include "hscallbk.as"
#undef sendmsg
#uselib ""
#func MySendMsg "" int, int, int, int
#func sendmsg "" sptr, sptr, sptr, sptr
setcallbk pSendMsg, MySendMsg, *MySendMsgFunc

//関数アドレス変更
	ladr=libptr(sendmsg)
	dupptr lptr, ladr+4*6, 4
	lptr= varptr(pSendMsg)
	
sendmsg hwnd,0x000C/*WM_SETTEXT*/,0,"12345"
mes sendmsg(hwnd,0x000E/*WM_GETTEXTLENGTH*/,0,0)
stop

*MySendMsgFunc
	sendmsg@hsp callbkarg(0), callbkarg(1), callbkarg(2), callbkarg(3)
return stat




[前へ] [戻る] [次へ]

(C)2019 inonote / 無断転載禁止