HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2026
0314
youdaiHSP3 32bit版をHSP3 64bit版化した時にエラーが起きてしまいました。この原因は何でしょうか?11解決


youdai

リンク

2026/3/14(Sat) 11:33:25|NO.104833

以下のスクリプトは標準のHSP3 32bit版だと正常動作するのですが、HSP3 64bit版だとなぜかエラーになってしまいます。
これはおそらく64bit版固有の理由だと思うのですが、思い込みで判断するのもよくないだろうと思って質問させて頂くことにしました。
これはなぜエラーになってしまうのでしょうか?
どこを改善すれば64bit版でも動作するのでしょうか?
それともこれは実行ファイルの作成の仕方に何か問題があるのでしょうか?

補足:
・HSPスクリプトエディタを使ってShift-JISで64bit版実行ファイルを作成しても同じでした。
・VSCodeとhspcを使ってUTF-8で64bit版実行ファイルを作成しても同じでした。
・64bit版におけるvarptrの問題はinoviaさんのhspint64.asを使えば解消できるらしいですが、今回関係あるかは不明です。

hspint64 - github
https://github.com/inovia/HSPInt64


;#include "hsp3_64.as" ;ドラッグ&ドロップしたアドレスを表示するスクリプト ;外部DLL呼び出し #uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" int,int #func DragQueryFile "DragQueryFileA" int,int,int,int #func DragQueryPoint "DragQueryPoint" int,int #func DragFinish "DragFinish" int ;定数 #define WM_DROPFILES 0x0233 screen 0, 320,320 redraw 0 mes "ファイルをここへ\nドラッグ&ドロップしてください" redraw 1 DragAcceptFiles hwnd, 1 ; このウィンドウを対象とする oncmd gosub *OnDropFiles, WM_DROPFILES ; WM_DROPFILES メッセージハンドラを設定 stop *OnDropFiles oncmd 0 hdrop = wParam;★ 64bit版だともしかしてここが32bit版と異なる? ; ドロップされたファイルの数を取得する DragQueryFile hdrop, -1, 0, 0 ndrop = stat if ndrop==0{ ;★ 64bit版だとなぜかndropが0として返答される ;何もドロップされていない判定(エラー) dialog "何もドロップされていません",1,"エラー" DragFinish hdrop; ドロップファイル情報をクリア (これをしないとメモリリークになる) end } ;ドロップされたファイルのアドレスを取得 folder_name = "" DragQueryFile hdrop, 0, varptr(folder_name), 260;★ 64bit版だとvarptrが問題になるかも? dialog str(folder_name),0,"これがドロップされました" DragFinish hdrop; ドロップファイル情報をクリア (これをしないとメモリリークになる) oncmd 1 return



この記事に返信する


naya

リンク

2026/3/14(Sat) 20:41:47|NO.104837

見当違いの回答でしたら申し訳ないのですが、64bitアプリから32bit用のDLLは利用できないみたいです。

AIの回答
64ビットアプリケーションは64ビットプロセスとして動作し、32ビットDLLは32ビットプロセスで動作します。
DLLは呼び出し元のプロセスと同じアドレス空間で実行される必要があるため、異なるアーキテクチャのDLLを直接ロードすることはできません。



youdai

リンク

2026/3/15(Sun) 12:41:54|NO.104846

>naya さん

アドバイスありがとうございます!
shell32.dllは名前に32と入っていますが、64bit版も同名のdllらしいので、これでよいみたいです。(多分)
例えば最初のDragAcceptFiles命令は、ファイルのウィンドウへ対するドラッグ&ドロップ有効化は実行されてるみたいですから、この部分においては、このスクリプトでも64bit版で動作してるみたいです。(でも、それが正常動作かどうかはまだ分からないです)

今、hspint64で色々試しています。
自分でダメそうだったら、またそのスクリプトを貼ってみます。



zrs90(5翁もどき)

リンク

2026/3/15(Sun) 16:46:16|NO.104851

参考になるか分かりませんが...
「hsp3 64ビット版 ドラッグドロップのサンプル」で検索

ドラッグドロップが64ビット版にしたら動かなくなった
(※未解決。動作出来ない理由?が書かれている)

https://hsp.tv/play/pforum.php?mode=pastwch&num=88691

⚫︎余談
AIの回答がウソっぽいのが出て閉口



youdai

リンク

2026/3/15(Sun) 17:47:57|NO.104852

>zrs90 さん

情報提供ありがとうございます。

BlueskyでKanogutiさんが提供してくれた情報を合わせるとhspint64を使ったとしても、hsp3 64bit版ではwParamがintとして取得される(構造体がintで取得されるから)ので、これが原因になってる可能性がありそうです。



naya

リンク

2026/3/15(Sun) 18:56:13|NO.104853

>zrs90さん
検索した情報で間違った回答をしてしまいすみません。
もうコメントはしません。



zrs90(5翁もどき)

リンク

2026/3/16(Mon) 02:40:34|NO.104858

nayaさん

気にする必要は全くありません

私の話は検索したら、llmod3のドラッグドロップのサンプルソースに
「hsp3_64.as」くっつけると動くみたいな回答をして来た「スマホAI」に
呆れかえっただけです←←コレ普通に見ても動きませんよね?(笑

回答を控えないといけないのは私の方です。誤解させてしまい
申し訳ありません



naya

リンク

2026/3/16(Mon) 02:54:44|NO.104859

>zrs90さん
私の早とちりでした。こちらこそすみませんでした。
どうかお気になさらないでください。
何より問題が解決する事を願っています(^^)



youdai

リンク

2026/3/16(Mon) 12:48:47|NO.104864

皆さん、アドバイスありがとうございました。

結局今は「HSP3_64bit版Windowsでiparamとwparamとlparamが4バイト整数なので正常に取得できない問題」があるので、この不具合は解消できないみたいです。
次のHSP3_64bit版の更新で改善されてるといいのですが。



X

リンク

2026/3/19(Thu) 16:30:07|NO.104882

このような感じでいかがでしょうか


#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



zakki

リンク

2026/3/20(Fri) 16:34:36|NO.104885

こんな感じでどうでしょう。
https://github.com/onitama/OpenHSP/compare/master...zakki:int64-hsp64?expand=1

int64型を追加して、ポインタやハンドルをint64化してて、親コメントの例は関数定義をint64対応すると動きます。

現状は、uselibの返り値でint64を扱いたい場合は、#funcで定義してstat64を見る必要があって、#cfuncでの返り値はint32のままです。
また配列長や文字列長はint32のままなので、単一変数は依然32bit制限が残ります。
hsp3.exeでint64変数は扱えなくして、hsp3_64.exeだけにするならstat64新設じゃなくてstatを64ビット化もアリかなと思います。


;外部DLL呼び出し #uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" int64,int #func DragQueryFile "DragQueryFileA" int64,int,int64,int #func DragQueryPoint "DragQueryPoint" int64,int #func DragFinish "DragFinish" int64

変更点
* 64ビットのstat64システム変数を追加
* int64型に変換するためのint64()関数を追加
* varptr, dupptr, hwnd, hinstance, hdc, wparam, lparam をint64に変更
* hsp3_64で外部dll呼び出しをlibffi実装に変更

制限
* COM関連機能は未対応
* 64bit版ではHSPCTX, HSP3TYPEINFO ,IRQDATのレイアウトが変わるので、既存プラグインと互換性がない
* hspcmpでint64リテラル非対応で、int64("12345678901234567890")のように文字列経由が必要

chsp実装で慣れてるあたりなのですぐ終わるかと思ったらそうでもなかった。



youdai

リンク

2026/3/20(Fri) 22:21:33|NO.104887

> X さん

アドバイスありがとうございます。
自作ツールに組み込んで実装することができました。
どうすればいいか自分だけではよく分からなかったので、とても助かりました!

> zakki さん

もしかして対応バージョンを生成してくれたんですか? すごいですね。
こういうやり方で対応するという方法もあるものなんですね。
勉強になります。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.104833への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.