mieki256's diary



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なる略称が流行ってしまったようで、ググってもそっちばかり出てくる…。

実行プログラムのパスを取得。 :

まずは、実行プログラムである自分自身のファイルパスを取得できそうか試してみる。それができれば、(自身のファイル名).ini のファイルパスを得ることもできるだろう…。

以下のページが参考になった。ありがたや。

_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ファイルを作成。実行してみる。

getexeloc_ss.png

取得できたっぽい。

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ファイルを生成。実行してみる。

read_ini_ss01.png

iniファイルの内容を取得できた。

一応少しだけ解説。
  • テキストファイルを読み込むには、notesel, noteload, noteget, notemax 等を使える。
  • ファイルの存在確認は、exist ファイルパス、が使える。その直後に strsize を調べてみて -1 だったらファイルは存在していない。
  • instr() で、指定文字列が入ってるかどうかを調べられる。
  • split を使って、任意の区切り文字で文字列を分割できる。

これで、"自分自身のファイル名".ini を読み込んで、中に書かれた文字列を取り出すことができた。

外部プログラムを実行。 :

HSPから外部プログラムを実行してみる。以下が参考になった。

_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ファイルの読み込みと、外部プログラムの実行はできたので、これをスクリーンセーバのサンプルに組み込んでいけば…。どうかな…。

以上です。

過去ログ表示

Prev - 2021/02 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project