|
|
2024/1/9(Tue) 18:50:15|NO.101000
64ビット版ランタイムでWindows APIのGetPrivateProfileString関数を呼び出すと落ちるのですが、原因がわかる人いますか?
#include "hsp3_64.as"
#uselib "kernel32.dll"
#func global WritePrivateProfileString "WritePrivateProfileStringW" wptr,wptr,wptr,wptr
#func global GetPrivateProfileString "GetPrivateProfileStringW" wptr,wptr,wptr,wptr,wptr,wptr
sdim buf,1024
GetPrivateProfileString "config","test","10", varptr(buf), 1024, "test.ini"
buf=cnvwtos(buf)
mes buf
|
|
2024/1/9(Tue) 19:11:38|NO.101001
> varptr(buf)
64bit版ランタイムのvarptr()の戻り値が32bitで返ってしまうので、
正しいメモリアドレスにアクセスできなくて落ちているのかと。
HspInt64を使わないと正しく取り扱えなかったはず。
https://hsp.moe/#hspint64
|
|
2024/1/9(Tue) 19:24:36|NO.101002
|
|
2024/1/11(Thu) 17:32:15|NO.101006
解決済みのスレッドや、質問ではないスレッドは返信していませんでした。すみませんでした。
拡張プラグインなしではvarptrが使えないのでしょうか?
|
|
2024/1/11(Thu) 20:43:12|NO.101007
>拡張プラグインなしではvarptrが使えないのでしょうか?
64bit版ランタイムはベータ版扱いであり、dupptrやvarptrは正常に機能していないので、
先ほどのプラグインを使用するか、以下のような回避コードを書く必要があるかと。
#include "hsp3_64.as"
#uselib "msvcrt.dll"
#func _snprintf "_snprintf" var,int,str,var
#uselib "kernel32.dll"
#func global WritePrivateProfileString "WritePrivateProfileStringW" wptr,wptr,wptr,wptr
#func global GetPrivateProfileString "GetPrivateProfileStringW" wptr,wptr,wptr,double,wptr,wptr
sdim buf, 1024*2
// dupptrが機能していないので、代替処理
sPtr = "" : _snprintf sPtr, 64, "%p", buf : d = 0.0
lpoke d, 0, int("$"+strmid(sPtr, -1, 8))
lpoke d, 4, int("$"+strmid(sPtr, 0, 8))
GetPrivateProfileString "config","test","10", d, 1024, dir_cur + "\\test.ini"
buf=cnvwtos(buf)
mes buf
|
|
2024/1/11(Thu) 20:51:00|NO.101008
ま、今回のケースに限っては以下のようなコードでも良かったりします。
(varptrを使わなければよいので、#funcのパラメータをvarに変えただけ)
#include "hsp3_64.as"
#uselib "kernel32.dll"
#func global WritePrivateProfileString "WritePrivateProfileStringW" wptr,wptr,wptr,wptr
#func global GetPrivateProfileString "GetPrivateProfileStringW" wptr,wptr,wptr,var,wptr,wptr
sdim buf, 1024*2
GetPrivateProfileString "config","test","10", buf, 1024, dir_cur + "\\test.ini"
buf=cnvwtos(buf)
mes buf
|
|
2024/1/13(Sat) 22:24:05|NO.101015
おお、ありがとうございます。そんな方法があったとは…。
varptrを64ビットに対応させたのですが、こんな感じでいいのでしょうか?
dupptrを64ビットに対応させる場合、どのように記述すればいいのですかね?
64ビット版ランタイムはUTF-8なので、_snwprintfの方が良い気が…。(しかも落ちる)
#include "hsp3_64.as"
//#include "hsp3utf.as"
#ifdef __hsp64__
#module
#uselib "msvcrt.dll"
#func _snprintf "_snprintf" var,int,str,var
//varptr 64ビット対応化
#undef varptr
#defcfunc varptr var buf
sPtr = "" : _snprintf sPtr, 64, "%p", buf : d = 0.0
lpoke d, 0, int("$"+strmid(sPtr, -1, 8))
lpoke d, 4, int("$"+strmid(sPtr, 0, 8))
return d
#global
#else
#endif
#uselib "user32.dll"
#func GetWindowText "GetWindowTextW" int,double,int
title "🔺◢😀💯ⓗⓢⓟ♠♡♣♤♪"
sdim buf,256
GetWindowText hwnd,varptr(buf),256
font "meiryo",16
mes cnvwtos(buf)
|
|
2024/1/14(Sun) 10:53:14|NO.101018
>dupptrを64ビットに対応させる場合、どのように記述すればいいのですかね?
HSP内部の変数を管理している領域にアクセスする必要があり、かなり難しいという認識。
dupptr相当の動作をさせるのに、途中でdupptrを呼び出す必要があるので、無理じゃね…?という
素直に拡張プラグインを使ったほうが良いです。
>64ビット版ランタイムはUTF-8なので、_snwprintfの方が良い気が…
今回取り扱う文字列が「0123456789ABCDEF%p」のみであり、
文字化けることはないため、_snprintf で問題ありません。
|
|
2024/1/15(Mon) 14:45:48|NO.101036
|
|
2024/1/15(Mon) 16:39:32|NO.101037
>int64を返すvarptr64やdupptr64みたいなのを追加することもできるんじゃないかと思います。
紹介したHspInt64プラグインで、64bitの算術演算や64bitポインタ、コールバック関数が普通に扱えているので、
頑張れば(?)HSP本体に組み込めそうではありそうですが…。
https://docs.hsp.moe/3.6/reference/hspint64.dll/varptr64/
プラグイン側での実装なので、0xFFFFFFFFFFFFFFFF のような即値の記述ができず
使い勝手がイマイチなのでHSP本体で標準でできるのが一番良いですねぇ…
// https://hsp.moe/#hspint64
#include "hsp3_64.as"
#include "hspint64.as"
a = int64(0)
a += int64(0x7FFFFFFF)
a += int64(0x7FFFFFFF)
a += int64(0x7FFFFFFF)
a += int64(0x7FFFFFFF)
mes a // 8589934588
b = int64("0xFFFFFFFFFFFFFFFE")
b += 1
mes b // -1
|
|
2024/1/22(Mon) 20:50:46|NO.101138
諸事情により、スレッドを放置してすみませんでした。
64ビットランタイムはベータ版だから仕方ないことなのでしょうかね…。
解決にしておきます。
|
|