INIファイルの文字列取得について

解決


ぴんく  2004-10-07 03:10:08  No: 85918

INIファイルから文字列の取得をしようとしていますが、渡した引数のセクションの文字がが途中で切られてしまい、うまく取得できません。コードは以下のように記述しています。どうしたらうまく取得できるのでしょうか。よろしくお願いします。(VB.NETの環境です。)
____________________________________________________
’API宣言
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
    (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal         lpDefault As String, ByVal lpReturnedString As String, ByVal 
    nSize As Long, ByVal inifilename As String) As Integer

    Public Function pfncGetIni(ByVal strSection As String, ByVal strKey As String, ByVal strDefaultString As String) As String

        Dim strFileName As String           'ファイル名称(フルパス)
        Dim lngRet As Long                  '戻り値
        Dim strTemp As String               '一時格納変数
        Dim intLen As Integer               '文字列長

        'INIファイル名取得
        strFileName = pfncGetAppPath()
        strFileName = strFileName & "\Config.ini"

        'バッファを確保
        strTemp = ""
        strTemp = strTemp.PadLeft(4, Chr(0))
        intLen = Len(strTemp)

        lngRet = GetPrivateProfileString(strSection, strKey, strDefaultString, strTemp, intLen, strFileName)

        Return Left(strTemp, InStr(strTemp, Chr(0)) - 1)

    End Function

____________________________________________________

たとえば、strSection(セクション名)を”営業所情報”で渡しますが、途中で”営業”となってしまいます。
これのせいで取得できないのかもわかりません。
まだ初心者なのでよろしくお願いしますm(__)m


GG  2004-10-07 03:45:36  No: 85919

自分でバッファを4バイトに制限しているから

        'バッファを確保
        strTemp = ""
        strTemp = strTemp.PadLeft(4, Chr(0))
        intLen = Len(strTemp)

全角で2文字までしか取得できないのでしょう。


魔界の仮面弁士  2004-10-07 05:53:33  No: 85920

Stringクラスは、「一度指定された値は変更できない」という仕様になっています。
そのため、文字列を「受け取る時」は、Stringクラスではなく、StringBuilderクラスを使ってください。

下記ののサイトが参考になるかと思います。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html

ついでに、ここも。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html

おまけ。 String クラスと StringBuilder クラスの動作の違いに付いて。

Dim X1 As String
Dim X2 As String

X1 = "ABC"   '値を代入
X2 = X1      'X1への参照を渡す
System.Console.WriteLine("X1とX2は同じオブジェクトか?:" & (X1 Is X2).ToString())
System.Console.WriteLine("X1とX2は同じ内容か?:" & (X1 = X2).ToString())

System.Console.WriteLine(" X1の内容を変更 ")
X1 = "ABCabc"   'X1の内容を変更

' ★★ Stringクラスの場合、下記は False を返す ★★
System.Console.WriteLine("X1とX2は同じオブジェクトか?:" & (X1 Is X2).ToString())
System.Console.WriteLine("X1とX2は同じ内容か?:" & (X1 = X2).ToString())

System.Console.WriteLine(" ============== ")

Dim S1 As System.Text.StringBuilder
Dim S2 As System.Text.StringBuilder

S1 = New System.Text.StringBuilder()
S2 = S1.Append("ABC")
System.Console.WriteLine("S1とS2は同じオブジェクトか?:" & (S1 Is S2).ToString())
System.Console.WriteLine("S1とS2は同じ内容か?:" & (S1.ToString() = S2.ToString()).ToString())

System.Console.WriteLine(" S1の内容を変更 ")
S1.Append("abc")   'S1の内容を変更

' ★★ StringBuilderクラスの場合、下記は True を返す ★★
System.Console.WriteLine("S1とS2は同じオブジェクトか?:" & (S1 Is S2).ToString())
System.Console.WriteLine("S1とS2は同じ内容か?:" & (S1.ToString() = S2.ToString()).ToString())


ぴんく  2004-10-07 20:33:58  No: 85921

早速の返答ありがとうございます!(__)
魔界の仮面弁士様の参考に調べてみて、「セクション、情報が格納されるバッファ、INIファイル名」をString型からStringBuilderに変えたところ文字が切れずにうまくいきました!StringBuilder型は初めて目にしたので書き込みしてほんとよかったです。
まだまだ勉強不足なもので、こんなに丁寧に説明していただきほんとにありがとうございました(^_^)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加