INIファイルを扱う
INIファイル
INIファイルとは、プログラムの設定などを保存するためのファイルです。
同じ目的のレジストリがありますが、これは嫌われてますね。
レジストリだと、アンインストールを正しく行う必要が出てくるし、手動でいじるのも面倒だし。
というわけで、INIファイルを操作するプログラムを作ります。
INIファイルは以下のようになっています。
関数の宣言
INIファイルを扱う関数はABで宣言されていませんので、自分で宣言します。
ini.sbpで保存してください。
'ini.sbp
Declare Function WritePrivateProfileString Lib"Kernel32" _
Alias "WritePrivateProfileStringA" ( _
lpAppName As *Byte, _ ' セクション名
lpKeyName As *Byte, _ ' キー名
lpString As *Byte, _ ' 追加するべき文字列
lpFileName As *Byte) As Long ' .ini ファイル
Declare Function GetPrivateProfileInt Lib"Kernel32" _
Alias "GetPrivateProfileIntA"(
lpAppName As *Byte, ' セクション名
lpKeyName As *Byte, ' キー名
nDefault As Long, ' キー名が見つからなかった場合に返すべき値
lpFileName As *Byte) As Long ' .ini ファイルの名前
Declare Function GetPrivateProfileString Lib"Kernel32" _
Alias "GetPrivateProfileStringA"(
lpAppName As *Byte, ' セクション名
lpKeyName As *Byte, ' キー名
lpDefault As *Byte, ' 既定の文字列
lpReturnedString As *Byte, ' 情報が格納されるバッファ
nSize As DWord, ' 情報バッファのサイズ
lpFileName As *Byte) As Long ' .ini ファイルの名前
INIファイルを扱う
INIファイルにデータを読み書きしてみましょう。
ファイル名はN88.iniで、testセクションのnameキーにデータhogeを書き込んでいます。
strcatで文字列にExを付けないように気をつけてください。
#console
#include<vcrt71.sbp>
#include"ini.sbp"
Dim buf[32] As Byte
Dim path[MAX_PATH] As Byte
'iniファイルは絶対パスで指定しないとWINDOWSフォルダに作られる。
GetCurrentDirectory(MAX_PATH , path)'カレントディレクトリの取得
strcat(path , "\N88.ini")'ファイル名を連結
WritePrivateProfileString("test" , "name" , "hoge" , path)'書き込み
GetPrivateProfileString("test" , "name" , "defsama" , buf , 32 , path)'読み込み
printf(Ex"[test] name = %s\n" , buf)'読み取った値を表示
exit(0)'終了
これで文字列を扱うことはできました。
数値を扱うときは少し勝手が違います。
書き込む時に数値は使えません。全て文字列に変換しなければなりません。
sprintfで数値を文字列に変換しています。
#console
#include<vcrt71.sbp>
#include"ini.sbp"
Dim buf[32] As Byte
Dim path[MAX_PATH] As Byte
Dim age As Long
Dim ret As Long'戻り値
age = 64
'iniファイルは絶対パスで指定しないとWINDOWSフォルダに作られる。
GetCurrentDirectory(MAX_PATH , path)'カレントディレクトリの取得
strcat(path , "\N88.ini")'ファイル名を連結
sprintf(buf , "%d" , age)
WritePrivateProfileString("test" , "age" , buf , path)'書き込み
ret = GetPrivateProfileInt("test" , "age" , 0 , path)'読み込み
printf(Ex"[test] age = %d \n" ,ret)'読み取った値を表示
exit(0)'終了