このような感じでいかがでしょうか
#include "hsp3_64.as"
#include "hspint64.as"
#const HSPNULL 0
#const MAX_PATHW 520
#uselib "kernel32.dll"
#func WideCharToMultiByte "WideCharToMultiByte" int, int, int, int, int, int, int, int
#define CP_SJIS 932
#define CP_UTF8 65001
#uselib "user32.dll"
#func SetWindowLongPtrA "SetWindowLongPtrA" int, int, int
#func CallWindowProcA "CallWindowProcA" int, int, int, int, int
#define GWLP_WNDPROC 0xFFFFFFFC
#uselib "shell32.dll"
#func DragAcceptFiles "DragAcceptFiles" int, int
#func DragQueryFile "DragQueryFileA" int, int, int, int
#func DragQueryFileW "DragQueryFileW" int, int, int, int
#func DragQueryPoint "DragQueryPoint" int, int
#func DragFinish "DragFinish" int
#define WM_DROPFILES 0x00000233
//screen 0, 320,320
screen 0, 960, 320// パスが見えるように
onexit goto *OnAppQuit
title "64bit WNDPROC Hook Test"
UTF8 = 0
ver = hspver
major = (ver >> 12) & 0x0000000F
minor = (ver >> 8) & 0x0000000F
if ( major == 3 ) {
if ( minor == 7 ) {
UTF8 = 1
}
}
// コールバック作成(引数4つ: HWND, UINT, WPARAM, LPARAM)
WndProcCallback = callback64_new(4, *OnWNDPROC)
// コールバック型変数から 64bit 関数ポインタを取得
WndProcPtr = int64(0)
WndProcPtr = callback64_getptr(WndProcCallback)
//hdrop64用のwparamを用意(一応)
_wparam64 = int64(0)
orgWndProc = int64(0)
// ウィンドウプロシージャ(WNDPROC)をフック
orgWndProc = cfunc64(RET_INT64, SetWindowLongPtrA, hwnd, GWLP_WNDPROC, WndProcPtr)
if ( orgWndProc != int64(0) ) {
mes "Hooked."
}
mes "ファイルをここへ\nドラッグ&ドロップしてください"
mes ""
DragAcceptFiles hwnd, 1 ; このウィンドウを対象とする
oncmd gosub *OnDropFiles, WM_DROPFILES ; WM_DROPFILES メッセージハンドラを設定
stop
*OnAppQuit
// 一応
if ( orgWndProc != int64(0) ) {
cfunc64v SetWindowLongPtrA, hwnd, GWLP_WNDPROC, orgWndProc
}
end
*OnDropFiles
hdrop64 = _wparam64
if ( hdrop64 == 0 ) {
dialog "HDROP が取得できていません",1,"エラー"
return
}
; ドロップされたファイルの数を取得
ndrop = cfunc64i(DragQueryFileW, hdrop64, -1, 0, 0)
if ( ndrop == 0 ) {
dialog "何もドロップされていません", 1,"エラー"
cfunc64v DragFinish, hdrop64
_wparam64 = 0
return
}
else {
dialog str(ndrop) + "個ドロップされました", 1, "ドロップされました"
}
// ファイル名取得(varptr64 を使う)
sdim fPath, MAX_PATHW + 2, ndrop
repeat ndrop
BufPtr = varptr(fPath(cnt))// varptr64に置き換えられる
// UTF16で取得
cfunc64v DragQueryFileW, hdrop64, cnt, BufPtr, 260// 文字数
loop
//dialog str(fPath), 0, "これがドロップされました"
repeat ndrop
// 基本 cnvwtos
//mes "" + cnvwtos(fPath(cnt))
if ( UTF8 ) {
// HSP 3.7
mes "" + UTF16LEtoUTF8(fPath(cnt))
}
else {
// HSP 3.6
mes "" + UTF16LEtoSJIS(fPath(cnt))
}
loop
// 後始末
cfunc64v DragFinish, hdrop64
_wparam64 = 0
return
*OnWNDPROC
// 0: HWND, 1: UINT, 2: WPARAM, 3: LPARAM
hwnd64 = callback64_getprm(WndProcCallback, 0, RET_INT64)
msg64 = callback64_getprm(WndProcCallback, 1, RET_INT64)
wparam64 = callback64_getprm(WndProcCallback, 2, RET_INT64)
lparam64 = callback64_getprm(WndProcCallback, 3, RET_INT64)
// WM_DROPFILES のときだけ保存
if ( msg64 == WM_DROPFILES ) {
_wparam64 = wparam64
}
// CallWindowProcA も cfunc64 で呼ぶ
ret64 = cfunc64(RET_INT64, CallWindowProcA, orgWndProc, hwnd64, msg64, wparam64, lparam64)
// WNDPROC の戻り値を Windows に返す
callback64_setret WndProcCallback, ret64
return 1
//UTF16LEからSJISに変換
#defcfunc UTF16LEtoSJIS var _UTF16,\
local _dataSize, \
local _BufSJIS
_dataSize = cfunc64i(WideCharToMultiByte, CP_SJIS, HSPNULL, varptr(_UTF16), -1, HSPNULL, HSPNULL, HSPNULL, HSPNULL)
sdim _BufSJIS, _dataSize
cfunc64v WideCharToMultiByte, CP_SJIS, 0, varptr(_UTF16), -1, varptr(_BufSJIS), _dataSize, HSPNULL, HSPNULL
return _BufSJIS
//UTF16LEからUTF8に変換
#defcfunc UTF16LEtoUTF8 var _UTF16,\
local _dataSize,\
local _Buf8
// WideCharToMultiByte(CP_UTF8, HSPNULL, _UTF16, -1, HSPNULL, HSPNULL, HSPNULL, HSPNULL)
// _dataSize = stat
_dataSize = cfunc64i(WideCharToMultiByte, CP_UTF8, HSPNULL, varptr(_UTF16), -1, HSPNULL, HSPNULL, HSPNULL, HSPNULL)
sdim _Buf8, _dataSize
//WideCharToMultiByte CP_UTF8, 0, varptr(_UTF16), -1, varptr(_Buf8), _dataSize, HSPNULL, HSPNULL
cfunc64v WideCharToMultiByte, CP_UTF8, 0, varptr(_UTF16), -1, varptr(_Buf8), _dataSize, HSPNULL, HSPNULL
return _Buf8