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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0109
ゆっくりXP64ビットのランタイムでWindows APIを使うと落ちる10解決


ゆっくりXP

リンク

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



この記事に返信する


TOMATO

リンク

2024/1/9(Tue) 19:11:38|NO.101001

> varptr(buf)
64bit版ランタイムのvarptr()の戻り値が32bitで返ってしまうので、
正しいメモリアドレスにアクセスできなくて落ちているのかと。

HspInt64を使わないと正しく取り扱えなかったはず。
https://hsp.moe/#hspint64



TOMATO

リンク

2024/1/9(Tue) 19:24:36|NO.101002

あと別件ですが、返信来ているスレッドに反応がないのは
心証が悪いよとだけ言っておきます。

https://hsp.tv/play/pforum.php?mode=all&num=100195
https://hsp.tv/play/pforum.php?mode=all&num=100395
https://hsp.tv/play/pforum.php?mode=all&num=100864



ゆっくりXP

リンク

2024/1/11(Thu) 17:32:15|NO.101006

解決済みのスレッドや、質問ではないスレッドは返信していませんでした。すみませんでした。
拡張プラグインなしではvarptrが使えないのでしょうか?



TOMATO

リンク

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



TOMATO

リンク

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



ゆっくりXP

リンク

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)



TOMATO

リンク

2024/1/14(Sun) 10:53:14|NO.101018

>dupptrを64ビットに対応させる場合、どのように記述すればいいのですかね?
HSP内部の変数を管理している領域にアクセスする必要があり、かなり難しいという認識。
dupptr相当の動作をさせるのに、途中でdupptrを呼び出す必要があるので、無理じゃね…?という

素直に拡張プラグインを使ったほうが良いです。

>64ビット版ランタイムはUTF-8なので、_snwprintfの方が良い気が…
今回取り扱う文字列が「0123456789ABCDEF%p」のみであり、
文字化けることはないため、_snprintf で問題ありません。



zakki

リンク

2024/1/15(Mon) 14:45:48|NO.101036

int64やfp32を実装した実験ブランチでとりあえず計算は出来てて、int64を返すvarptr64やdupptr64みたいなのを追加することもできるんじゃないかと思います。
https://github.com/onitama/OpenHSP/compare/master...zakki:OpenHSP-fork:var-types

使い勝手をint32やfp64並みにするには結構手間がかかりそうって話をしてました。
https://twitter.com/onionsoftware/status/1716062386883592277



TOMATO

リンク

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



ゆっくりXP

リンク

2024/1/22(Mon) 20:50:46|NO.101138

諸事情により、スレッドを放置してすみませんでした。
64ビットランタイムはベータ版だから仕方ないことなのでしょうかね…。
解決にしておきます。



記事削除

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

NO.101000への返信

マスコット

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

名前

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

削除用パスワード

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

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

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