iniファイルは、アプリケーションなどの設定を保存しておく単なるファイルです。
「config.ini」のようなファイルを見たことがありませんか?
これにユーザの設定を保存しておくことができます。
レジストリを使わないので非常にスマートです。
ここではHSPからiniファイルを扱う方法を取り上げますが、少し難しいです。
(モジュール、外部DLLの使用技術が必要です。)
iniファイルは、次の様な感じになっています。
[Section]
key1=1234
key2=ユーザー名
x=45
・・・
[Section]はセクション名です。
セクションは、設定のあるまとまりを表すものです。
後述するキーと比較すると、セクションは「フォルダ」のようなものです。
key1やkey2はキーです。これは「ファイル」と例えることができます。
そして「1234」や「ユーザー名」というのはキーの値です。これは「ファイルの中身」のようなものですね。
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
というように保存されます。
#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」ができるはずです。
内容はこうなるでしょう。
[WindowConfig]
Xsize=500
Ysize=300
[UserConfig]
UserName=Luna
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の変数の記憶できる最大サイズでいいでしょう。
#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ファイル操作ができるモジュールを作ってみました。
#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ファイルの名前を設定します。変数名で指定することはできません。