DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NETでのINIファイル取り扱いについて

環境/言語:[VB.NET 2003]
分類:[.NET]

はじめまして。
さっそく質問なのですが、現在VB.NETでINIファイルを読み書きするコードを書いているのですが、連続してINIファイルを参照すると正確に読み込めていないようです。

(AAA.INI)
[LIST1]
0001=あいうえお
0002=かきくけこ
0003=さしすせそ
00xx=そのほかの文字列データですよ〜ん
---

<DllImport("KERNEL32.DLL", CharSet:=CharSet.Auto)> _
Public Shared Function GetPrivateProfileString( _
ByVal lpAppName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As System.Text.StringBuilder, ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer
End Function

----

'INIファイル呼出用
Dim strSb As System.Text.StringBuilder
strSb = New System.Text.StringBuilder

Dim result As String

'1回目呼び出し
dim value as string = "00"
dim value2 as string = "09"
GetPrivateProfileString("LIST1", value & value2, strSb, _
strSb.Capacity, iniFile)

result = strSb.ToString

If result = "NONE" Then
GetPrivateProfileString("LIST1", value & "xx", "NONE", strSb, _
strSb.Capacity, iniFile)
result = strSb.ToString
End If

コードのとおり1度目のGetPrivateProfileStringで該当データがない場合に「それ以外」のコードで参照しております。
しかし、「それ以外」を参照するGetPrivateProfileStringで呼び出した結果が、途中できれてしまいます。
(例ですと「そのほかの文字列データですよ〜ん」が「そのほかの文字列データですよ〜」で切れてしまいます)

なぜこのような現象が発生するのでしょうか。
恐れ入りますがお力をお貸しくださいますようよろしくお願いいたします。
> GetPrivateProfileString("LIST1", value & value2, strSb, _
> strSb.Capacity, iniFile)

取得できる容量は第四引数に依存します。
strSb.Capacityは十分な数ですか?

strSb = New System.Text.StringBuilder(1024)
などとするとどうですか?
> GetPrivateProfileString("LIST1", value & value2, strSb, _
> strSb.Capacity, iniFile)

呼び出し引数が不足しているような……。(^^;


> GetPrivateProfileString("LIST1", value & "xx", "NONE", strSb, _
strSb.Capacity, iniFile)

ここでは、第5引数の値が重要になってきます。

この手の文字列を返して来るタイプのAPIは、呼び出し前に、
文字列を受け取る分のメモリ領域を確保しておく必要があります。
たとえば、
 Dim sb As StringBuilder = New StringBuilder(256)
という感じですね。(この場合は256文字分の領域が、変数 sb に確保されます)

しかし API 側は、.NET 側で確保された領域のサイズを知りません。
そこで引数として、バッファ領域のサイズも渡す必要があるわけです。
(第5引数に渡している Capacity がそれです)


そしてサイズを指定せず、単に
 sb = New StringBuilder()
のようにした場合、規定の領域サイズが確保される事になります。
この値は実装依存ですが、結果が「そのほかの文字列データですよ〜」の
15文字である事を見ると、Capacity の値はおそらく 16 だったのでしょう。

# このAPIは、文字列の終端に ChrW(0) を埋め込むので、
# 使用可能なバッファサイズは、一つ少なくなります。
IniFileクラス
http://jeanne.wankuma.com/library/inifile/

ってか、XMLファイル使いましょうよ。
まどか さん:
魔界の仮面弁士 さん:

アドバイスありがとうございます。
アドバイスどおり宣言してやると、正常な値を読んできてくれました。

本当にありがとうございました。

名無しぃシャープ さん:
私も最初は「XMLにしましょう」って言ったんです。
しかし先方が「XMLはよくわからないからINIにして」・・・って言われまして。。
で、「.NETはXML推奨ですよ〜」「XMLって別に敬遠すること難しいものじゃないですよ〜」って言ったんですが、それでもなお「INIで出来るならしてよ」って・・・「んじゃあ、VB6で作りましょうよ」って言うと「.NET2003で!」ってな具合で。
orz
解決済み!
もろにリンク先にあるような流れですねww
わからないならダイアログ作ればいいのにねー
解決済み!
> 名無しぃシャープ さん:
> 私も最初は「XMLにしましょう」って言ったんです。
> しかし先方が「XMLはよくわからないからINIにして」・・・って言われまして。。
> で、「.NETはXML推奨ですよ〜」「XMLって別に敬遠すること難しいものじゃないですよ〜」って言ったんですが、それでもなお「INIで出来るならしてよ」って・・・「んじゃあ、VB6で作りましょうよ」って言うと「.NET2003で!」ってな具合で。

顧客から「.NET で .INI を扱う」分のコストを引き出せてるならそれでもいいでしょうけど、総額に変化ないならその分の工数が持ち出しになっちゃいますね。

DOBON.NET | プログラミング道 | プログラミング掲示板