- PR -

VB.NETでINIファイルのキー名を取得するには

投稿者投稿内容
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-17 16:49
引用:

かるあさんの書き込み (2006-05-17 16:39) より:
String や StringBuilder で受けると NULL の部分で切れますね


StringBuilder は確かに NULL で切りますが、String は切りません。NULL 区切りの文字列配列を受けるのに便利です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 16:54
引用:

Hongliangさんの書き込み (2006-05-17 16:39) より:

MessageBox にしろ TextBox にしろ、NULL 文字以降は表示してくれないので「見た目には」失敗しているようにしか見えないかと。
NullChar で stBuffer を Split してやらないと。


そうでした。(;^-^)
すぐさま MessageBox.Show というのは不適切でした。

引用:

Split する前に TrimEnd で後ろのよけいな NullChar を削除すると便利かな。


拝承。直しておきます。

コード:

    <System.Runtime.InteropServices.DllImport("KERNEL32.DLL", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function GetPrivateProfileSection( _
        ByVal appName        As String,  _
        ByVal returnedString As String,  _
        ByVal bufferSize     As Integer, _
        ByVal fileName       As String) As Integer
    End Function

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim stBuffer As String = New String(Microsoft.VisualBasic.ControlChars.NullChar, 1024)

        GetPrivateProfileSection("MosaMosaAA", stBuffer, 1024, "C:\MakiMakiLove.ini")

        Dim stResult As String = stBuffer.TrimEnd(Microsoft.VisualBasic.ControlChars.NullChar)
        Dim stSplits As String() = stResult.Split(Microsoft.VisualBasic.ControlChars.NullChar)

        For Each st As String In stSplits
            MessageBox.Show(st)
        Next
    End Sub


投稿前に試すのを怠ってはいけませんね... (;_ _)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-17 16:55
引用:

Hongliangさんの書き込み (2006-05-17 16:49) より:

StringBuilder は確かに NULL で切りますが、String は切りません。NULL 区切りの文字列配列を受けるのに便利です。


あっそうだったんですね
無駄に byte配列 で受けて ループ処理してしまった・・・
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-17 18:08
[quote]
じゃんぬねっとさんの書き込み (2006-05-17 16:54) より:
引用:

Hongliangさんの書き込み (2006-05-17 16:39) より:

コード:
    <System.Runtime.InteropServices.DllImport("KERNEL32.DLL", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function GetPrivateProfileSection( _
        ByVal appName        As String,  _
        ByVal returnedString As String,  _
        ByVal bufferSize     As Integer, _
        ByVal fileName       As String) As Integer
    End Function

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim stBuffer As String = New String(Microsoft.VisualBasic.ControlChars.NullChar, 1024)

        GetPrivateProfileSection("MosaMosaAA", stBuffer, 1024, "C:MakiMakiLove.ini")

        Dim stResult As String = stBuffer.TrimEnd(Microsoft.VisualBasic.ControlChars.NullChar)
        Dim stSplits As String() = stResult.Split(Microsoft.VisualBasic.ControlChars.NullChar)

        For Each st As String In stSplits
            MessageBox.Show(st)
        Next
    End Sub


投稿前に試すのを怠ってはいけませんね... (;_ _)







Hongliang様、じゃんぬねっと様、かるあ様、返答ありがとうございます。
じゃんぬねっと様、わざわざ試していただいてありがとうございます。

掲載されていたコードで試したところ、
INIファイルの内容を配列で取得することができました。

しかし、取得した値が
stSplits[1] A1B=7v3Gl1GRo4Q4ZyTl0vBSWxXNFFIHGMqpI=
stSplits[2] C2D=7v3Gl1GRo4Q4ZyTl0vBSWxXN1Jc/zQshULFFIHGMqpI
stSplits[3] E3F=7v3Gl1GRo4Q4ZyTl0vBSWxXN1Jc/zQshULFFIHG!!!!!
stSplits[4] G4H=7v3Gl1GRo4Q4ZyTl0vBSWxXN1Jc/zQshULFFIHG$$$$=
でした。

理想は「A1B」「C2D」「E3F」「G4H」を取得したいのですが、
このあたりの変数を詳しくみてみましたが、
キー名だけを保持または取得できる関数はないようでした。

たびたび質問して申し訳ありませんが、
キー名のみを取得するにはどうしたらいいのでしょうか?
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-17 18:12
これでキー部分のみ取得できると思います。
コード:

Private Declare Function GetPrivateProfileBytes Lib "KERNEL32.DLL" Alias "GetPrivateProfileStringA" ( _
ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As Byte(), _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer

Private Function GetPrivateProfileKeys(ByVal section As String, ByVal fileName As String) As String()
Dim returnByte(1024) As Byte

Dim returnLength As Integer = GetPrivateProfileBytes(section, Nothing, Nothing, returnByte, returnByte.Length, fileName)
Dim returnString As String = Encoding.Default.GetString(returnByte, 0, returnLength - 1)
Return returnString.Split(Microsoft.VisualBasic.ControlChars.NullChar)

End Function



[ メッセージ編集済み 編集者: うにくま 編集日時 2006-05-17 18:15 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 19:15
引用:

わしこさんの書き込み (2006-05-17 18:08) より:

たびたび質問して申し訳ありませんが、
キー名のみを取得するにはどうしたらいいのでしょうか?


先ほど紹介した、IniFile クラスをクラス ライブラリとして加えて利用したらどうですか? (;^-^)
どうも先ほどのレスを見ると、

引用:

XMLを使用する方が推奨されているのですね。
なるべく単純な方法で最善の手段をとりたいと思っていますので、
参考にさせていただきいます。


XML ファイル云々についてのみ書かれており、
本題である IniFile クラスについてはスルーされているようでしたので...

  IniFile クラス

参照設定で、この DLL を追加するだけ使えます。
お望みどおり、好きな Section 丸ごと読み込み Key 名だけ取得することもできます。

先ほども述べたように、ReadSection メソッドを使います。
戻り値は、Key と Value が分割されたコレクションとして取得できます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-18 11:36
*****************************
*********解決しました*********
*****************************

うにくま様、じゃんぬねっと様、返答ありがとうございます。

うにくま様の掲示してくださった方法で、無事解決することができました。

じゃんぬ様のDLL追加はただいま試み中です。
なんせ.NET始めて1週間なものですから、参照設定はできたものの
利用の仕方で四苦八苦しています。
オブジェクトブラウザでみたところReadSection メソッドを発見しましたので、
もう一息といったところでしょうか。。


なにはともあれ、みなさまのお陰で無事解決できました。
本当にありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-18 22:35
引用:

わしこさんの書き込み (2006-05-18 11:36) より:

なんせ.NET始めて1週間なものですから、参照設定はできたものの利用の仕方で四苦八苦しています。
オブジェクトブラウザでみたところReadSection メソッドを発見しましたので、
もう一息といったところでしょうか。。


ですね。(^^)
ReadSection メソッドの戻り値のコレクションを理解すればバッチリです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)