2021/02/06(土) [n年前の日記]
#3 [hsp] HSPでiniファイルの読み込み
スクリーンセーバのラッパーっぽいプログラムをHSPで書けないものかなと思い立った。HSPにはスクリーンセーバを作成するサンプルが同梱されているので、ソレを参考にして改造すれば作れるのではないかと。
HSPというのは、ゲームやツールを作れるプログラミング環境、という説明でいいのだろうか。Windows / Linux上で利用できる。
_プログラミング言語 HSP 公式 - HSPTV!
_onitama/OpenHSP: Hot Soup Processor
Windows10 x64 20H2上に、HSP3.51 と HSP3.6beta4 をインストールした。基本的には HSP3.6beta4 で動作確認をしていく。
余談。最近は心理学関係の何かでHSPなる略称が流行ってしまったようで、ググってもそっちばかり出てくる…。
HSPというのは、ゲームやツールを作れるプログラミング環境、という説明でいいのだろうか。Windows / Linux上で利用できる。
_プログラミング言語 HSP 公式 - HSPTV!
_onitama/OpenHSP: Hot Soup Processor
Windows10 x64 20H2上に、HSP3.51 と HSP3.6beta4 をインストールした。基本的には HSP3.6beta4 で動作確認をしていく。
余談。最近は心理学関係の何かでHSPなる略称が流行ってしまったようで、ググってもそっちばかり出てくる…。
◎ 実行プログラムのパスを取得。 :
まずは、実行プログラムである自分自身のファイルパスを取得できそうか試してみる。それができれば、(自身のファイル名).ini のファイルパスを得ることもできるだろう…。
以下のページが参考になった。ありがたや。
_HSP3 あれこれ 【ファイル関連サンプルソース】 - Let's HSP!
_getexeloc.hsp
HSPスクリプトエディタで開いて、Ctrl + F9 を叩いて exeファイルを作成。実行してみる。
取得できたっぽい。
以下のページが参考になった。ありがたや。
_HSP3 あれこれ 【ファイル関連サンプルソース】 - Let's HSP!
_getexeloc.hsp
; 実行プログラムの名前やパスを取得してみる ;; 実行ファイル名を指定 #packopt name "getexeloc" ;; exe生成を指定 #packopt type 0 #uselib "kernel32" #func GetModuleFileName "GetModuleFileNameA" int, int, int sdim filepath, 256 GetModuleFileName, varptr(filepath), 256 cls mes "dir_cur : " + dir_cur mes "dir_exe : " + dir_exe mes "filepath : " + filepath ;; ファイル名のみ取得 mes "filename : " + getpath(filepath, 8) ;; 拡張子を除外してiniファイル名にする mes "ini file : " + getpath(filepath, 1) + ".ini"
HSPスクリプトエディタで開いて、Ctrl + F9 を叩いて exeファイルを作成。実行してみる。
取得できたっぽい。
◎ iniファイルを読み込む。 :
iniファイルを読み込んでみる。
_read_ini.hsp
iniファイルは以下。
_read_ini.ini
HSPスクリプトエディタで Ctrl + F9 を叩いて exeファイルを生成。実行してみる。
iniファイルの内容を取得できた。
一応少しだけ解説。
これで、"自分自身のファイル名".ini を読み込んで、中に書かれた文字列を取り出すことができた。
_read_ini.hsp
; iniファイルを読み込んでみる
;; 実行ファイル名とexe生成を指定
#packopt name "read_ini"
#packopt type 0
fullscreen_bin = ""
config_bin = ""
preview_img = ""
#uselib "kernel32"
#func GetModuleFileName "GetModuleFileNameA" int, int, int
;; 自分自身のファイル名を取得
sdim filepath, 256
GetModuleFileName, varptr(filepath), 256
;; iniファイルのファイルパスを生成
ini_filepath = getpath(filepath, 1) + ".ini"
;; iniファイル読み込み
ini_data = ""
notesel ini_data
; iniファイル存在チェック
exist ini_filepath
if strsize = -1 {
mes "Not found " + ini_filepath
} else {
; iniファイルを読み込む
noteload ini_filepath
; 1行ずつ内容を解析して記録
sdim ld, 512
repeat notemax
noteget ld, cnt ; 1行分を取得
if instr(ld, 0, "fullscreen_bin=") >= 0 {
split ld, "=", kind, cmd
gosub *checkfileexist
fullscreen_bin = cmd
}
if instr(ld, 0, "config_bin=") >= 0 {
split ld, "=", kind, cmd
gosub *checkfileexist
config_bin = cmd
}
if instr(ld, 0, "preview_img=") >= 0 {
split ld, "=", kind, cmd
gosub *checkfileexist
preview_img = cmd
}
loop
}
cls
mes "fullscreen : " + fullscreen_bin
mes "config : " + config_bin
mes "preview : " + preview_img
; main loop
repeat
; ESC key to exit
stick key, 128
if key & 128 : end
await (1000 / 60)
loop
end
; ファイルの存在チェック。
; cmd にファイルパスを入れて呼ぶ。
; ファイルが存在しなかったら cmd が空文字列になって返る。
*checkfileexist
if cmd = "" : return
exist cmd
if strsize = -1 {
cmd = ""
}
return
iniファイルは以下。
_read_ini.ini
fullscreen_bin=D:\home\prg\hsp\fullscreen\boundball.exe config_bin=D:\home\prg\hsp\fullscreen\boundball_cfg.exe preview_img=D:\home\prg\hsp\fullscreen\sample.bmp
HSPスクリプトエディタで Ctrl + F9 を叩いて exeファイルを生成。実行してみる。
iniファイルの内容を取得できた。
一応少しだけ解説。
- テキストファイルを読み込むには、notesel, noteload, noteget, notemax 等を使える。
- ファイルの存在確認は、exist ファイルパス、が使える。その直後に strsize を調べてみて -1 だったらファイルは存在していない。
- instr() で、指定文字列が入ってるかどうかを調べられる。
- split を使って、任意の区切り文字で文字列を分割できる。
これで、"自分自身のファイル名".ini を読み込んで、中に書かれた文字列を取り出すことができた。
◎ 外部プログラムを実行。 :
HSPから外部プログラムを実行してみる。以下が参考になった。
_exec命令 (外部プログラムの起動) HSP3入門講座 - Let's HSP!
_exec_tes.hsp
実行すると、Windowsの電卓が起動する。
とりあえず、iniファイルの読み込みと、外部プログラムの実行はできたので、これをスクリーンセーバのサンプルに組み込んでいけば…。どうかな…。
_exec命令 (外部プログラムの起動) HSP3入門講座 - Let's HSP!
_exec_tes.hsp
; 外部プログラムを実行
#packopt name "exec_tes"
#packopt type 0
exe_path = "C:/Windows/System32/calc.exe"
exist exe_path
if strsize = -1 {
mes "Not found " + exe_path
wait 5 * 100
end
}
exec exe_path
end
実行すると、Windowsの電卓が起動する。
とりあえず、iniファイルの読み込みと、外部プログラムの実行はできたので、これをスクリーンセーバのサンプルに組み込んでいけば…。どうかな…。
[ ツッコむ ]
以上です。

