HSPルーム

1-2.iniファイルを使う

HSP3.0

iniファイルって?

iniファイルは、アプリケーションなどの設定を保存しておく単なるファイルです。
「config.ini」のようなファイルを見たことがありませんか?
これにユーザの設定を保存しておくことができます。
レジストリを使わないので非常にスマートです。

ここではHSPからiniファイルを扱う方法を取り上げますが、少し難しいです。
(モジュール、外部DLLの使用技術が必要です。)

iniファイルの構造

iniファイルは、次の様な感じになっています。

iniファイルの構造
[Section]
key1=1234
key2=ユーザー名
x=45
・・・

[Section]はセクション名です。
セクションは、設定のあるまとまりを表すものです。
後述するキーと比較すると、セクションは「フォルダ」のようなものです。

key1やkey2はキーです。これは「ファイル」と例えることができます。
そして「1234」や「ユーザー名」というのはキーの値です。これは「ファイルの中身」のようなものですね。

WritePrivateProfileStringA

iniファイルに書き込むには、「WritePrivateProfileStringA」を使います。
kernel32.dllを#uselibすることによって使えます。

BOOL WritePrivateProfileString(
  LPCTSTR lpAppName, // セクション名
  LPCTSTR lpKeyName, // キー名
  LPCTSTR lpString, // 追加するべき文字列
  LPCTSTR lpFileName // .ini ファイル
);

これをHSPで#funcすると、
 #func WritePrivateProfileString "WritePrivateProfileStringA" sptr,sptr,sptr,sptr
となります。
 (わからない方へ:
 ここでは、ただ単にWritePrivateProfileString命令を宣言しているだけです。
 別に高度なことをやっているわけではないです。)

これだけなら結構楽にできそうですね。

書き込んでみる

WritePrivateProfileString命令の、p1には保存させたいセクション名、p2にはキー名、p3には追加するキーの値、p4には保存するiniファイル名 を指定します。

そうするとiniファイルは、

[p1]
p2=p3

というように保存されます。

WritePrivateProfileStringAを使う
#uselib "kernel32.dll"
#define INI "./設定.ini" //保存するiniファイルの名前(./をつけないといけない)
#func saveini "WritePrivateProfileStringA" sptr,sptr,sptr,sptr
 //↑ここでは、わかりやすくsaveini命令を宣言しています。
	saveini "WindowConfig","Xsize","500",INI
	saveini "WindowConfig","Ysize","300",INI
	saveini "UserConfig","UserName","Luna",INI
	stop

実行すると、そのスクリプトのディレクトリに「設定.ini」ができるはずです。
内容はこうなるでしょう。

iniファイルの内容
[WindowConfig]
Xsize=500
Ysize=300
[UserConfig]
UserName=Luna

GetPrivateProfileStringA

iniファイルに無事書き込めた、ということで、次は読み込んでみます。
「GetPrivateProfileStringA」を使います。

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName , LPCTSTR lpKeyName ,
  LPCTSTR lpDefault ,
  LPTSTR lpReturnedString , DWORD nSize ,
  LPCTSTR lpFileName
);

HSPで宣言すると、
 #func GetPrivateProfileString "WritePrivateProfileStringA" sptr,sptr,sptr,var,int,sptr
というようになります。

読み込んでみる

GetPrivateProfileString命令の、p1にはセクション名、p2にはキー名、p3には(今のところ)""、 p4には読み込む変数、p5には読み込むサイズ、p6にはinファイル名を指定します。
読み込むための変数p4が大事ですので、読み込むのに十分な容量を確保しておいてください。
p5は、p4の変数の記憶できる最大サイズでいいでしょう。

GetPrivateProfileStringAを使う
#uselib "kernel32.dll"
#define INI "./設定.ini" //保存するiniファイルの名前(./をつけないといけない)
#func saveini "WritePrivateProfileStringA" sptr,sptr,sptr,sptr
#func loadini "GetPrivateProfileStringA" sptr,sptr,sptr,var,int,sptr
 //↑ここでは、わかりやすくloadini命令を宣言しています。
	saveini "UserConfig","UserName","Luna",INI
	sdim data,100
	loadini "UserConfig","UserName","",data,100,INI
	mes data
	stop

これで自由に読み込みができますね。
loadini命令のp3には、もしp2で指定したキーが見つからなかった場合、p4の変数に代入される値を指定します。


モジュール

iniファイル操作ができるモジュールを作ってみました。

iniファイル操作モジュール「iniini.hsp」
#module "iniini"
#uselib "kernel32.dll"
#func __saveini "WritePrivateProfileStringA" sptr,sptr,sptr,sptr
#func __loadini "GetPrivateProfileStringA" sptr,sptr,sptr,var,int,sptr
#deffunc _saveini str appname,str keyname,str string
	__saveini appname,keyname,string,iniinifile@
	return
#deffunc _loadini str appname,str keyname,var rstring,int rstringsize
	__loadini appname,keyname,"",rstring,rstringsize,iniinifile@
	return
#define global fileini(%1) iniinifile@=%1
#define global saveini(%1,%2,%3) _saveini %1,%2,%3
#define global loadini(%1,%2,%3,%4=64) _loadini %1,%2,%3,%4
#global

saveini "p1","p2","p3"  //iniファイルで保存
p1=セクション名 : p2=キー名 : p3=保存する値
 iniファイルに書き込みます。この命令より前にfileini命令で保存するファイルを設定する必要があります。

loadini "p1","p2",p3,p4(64)  //iniファイルを読み込み
p1=セクション名 : p2=キー名 : p3=保存する変数 : p4=読み込むサイズ(省略可)
 iniファイルを読み込みます。この命令より前にfileini命令で読み込むファイルを設定する必要があります。

fileini "p1"  //読み込むファイル設定
p1=ファイル名
 iniファイルの名前を設定します。変数名で指定することはできません。