- PR -

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

投稿者投稿内容
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-17 15:25
VB.NETでローカルにあるINIファイルを読み込もうとしています。

キー名に当てられた値は
GetPrivateProfileString(…
で取得することができたのですが、
セクションが「TEST」内の
キー名(5つ存在します)を取得することができません。
理想は5つのキー名をリストで取得することです。

どこかのHPに
GetPrivateProfileSection("TEST", strResult, Len(strResult), "C:\test.ini")
で取得できると書いてあったので試してみましたが、
何もかえってこないし
strResultも音沙汰なしです…。

VB.NETではINIファイルのキー名を取得することはできないのでしょうか?
詳しい方いらっしゃいましたらおしえてください。

[ メッセージ編集済み 編集者: わしこ 編集日時 2006-05-17 15:30 ]

>>>>追記
INIファイルの内容
[TEST]
A1B=7v3Gl1GRo4Q4ZyTl0vBSWxXNFFIHGMqpI=
C2D=7v3Gl1GRo4Q4ZyTl0vBSWxXN1Jc/zQshULFFIHG!!!!!
E3F=7v3Gl1GRo4Q4ZyTl0vBSWxXN1Jc/zQshULFFIHGMqpI
G4H=7v3Gl1GRo4Q4ZyTl0vBSWxXN1Jc/zQshULFFIHG$$$$=
I5J=7v3Gl1GRo4Q4ZyT!!!!!WxXN1Jc/zQshULFFIHGMqpI=

となっていて、取得したいのは
「A1B」「C2D」「E3F」「G4H」「I5J」
です。

[ メッセージ編集済み 編集者: わしこ 編集日時 2006-05-17 15:47 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-17 15:47
引用:

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

GetPrivateProfileSection("TEST", strResult, Len(strResult), "C:test.ini")
で取得できると書いてあったので試してみましたが、
何もかえってこないし
strResultも音沙汰なしです…。


GetPrivateProfileSection はどのように定義していますか?

なにも帰ってこない のと 音沙汰が無い 変数には
何が入っていますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 15:51
引用:

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

GetPrivateProfileSection("TEST", strResult, Len(strResult), "C:\test.ini")
で取得できると書いてあったので試してみましたが、何もかえってこないし strResultも音沙汰なしです…。


P/Invoke の宣言方法が間違えていたりしませんか?
または、十分なバッファ サイズが渡っていないとか色々考えられるので、
とりあえず、GetPrivateProfileSection までの記述と DllImport の宣言部分を教えて頂けませんか?

個人的には、「XML ファイルを使ってください」と言いたい場面ですが、
私のサイトに、こんなものがありますので、使ってみるのも手かもしれません。

  IniFile クラス

該当する機能を持つメソッドは、ReadSection メソッドです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-17 15:51
かるあさん、返答ありがとうございます。
解りにくい書き込みですみません。

*****GetPrivateProfileSectionの定義*****

Declare Function GetPrivateProfileSection Lib "KERNEL32.dll" Alias "GetPrivateProfileSectionA" _
(ByVal lpAppName As String, ByVal lpReturnedString As String, _
ByVal nSize As Integer, ByVal lpFileName As String) As Integer

**************************

「音沙汰がない」と書いていましたが、
上のように定義しなおすと、一応値が入りました。

GetPrivateProfileSection("TEST", strResult, Len(strResult), "C:\test.ini")

strResultに「A1B=7v3Gl1GRo4Q4ZyTl0vBSWxXNFFIHGMqpI=」という
値が返ってきました。
しかし、取得したいのは「A1B」「C2D」「E3F」「G4H」「I5J」
なのです。
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-17 16:02
じゃんぬねっと様、返答ありがとうございます。

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

以下、ソースです。

Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Security
Imports System.Security.Cryptography

Declare Function GetPrivateProfileSection Lib "KERNEL32.dll" Alias "GetPrivateProfileSectionA" _
(ByVal lpAppName As String, ByVal lpReturnedString As String, _
ByVal nSize As Integer, ByVal lpFileName As String) As Integer


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim strVar As String
Dim ret As String
Dim i As Integer
Dim strResult As String = Space(255)

GetPrivateProfileSection("TEST", strResult, Len(strResult), "C:\test.ini")

End Sub
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 16:26
試していませんが、こんな感じでしょうか。

コード:

    <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, stBuffer.Length, "C:\MakiMakiLove.ini")

        MessageBox.Show(stBuffer)
    End Sub


できない場合は、IntPtr から Byte 単位で読み込むことになるかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-17 16:39
引用:

コード:
        MessageBox.Show(stBuffer)




MessageBox にしろ TextBox にしろ、NULL 文字以降は表示してくれないので「見た目には」失敗しているようにしか見えないかと。
NullChar で stBuffer を Split してやらないと。
Split する前に TrimEnd で後ろのよけいな NullChar を削除すると便利かな。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-17 16:39
String や StringBuilder で受けると NULL の部分で切れますね
Byte 配列で受けて整形する必要がありそうですね

めんどくさい・・・

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