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)'終了