VB.netでINIファイルから文字列を取得するには?

解決


ZZZ  2003-04-02 20:43:24  No: 77526

VBでINIファイルから文字列を取得したりするときにAPI関数のGetPrivatefileStringとかWritePrivateProfileStringがありましたが、VB.netで同様のことがしたいのですが教えて下さい。


Say  2003-04-02 21:42:06  No: 77527

API関数はVB6独自の機能ではありません。
API関数の使用法は原則として言語に依存しません。
(当然、コーディングは言語に依存しますが・・・。)

また、iniファイルはただのテキストですから、
やろうと思えば、APIを使わず
Open,Input#,Close,あるいはFileSystemObjectで
操作することも可能です。


魔界の仮面弁士  2003-04-02 21:42:43  No: 77528

VB.NET でも、Get/WritePrivateProfileString API を呼び出す事はできます。
(DllImport属性、もしくはDeclareステートメントにて定義します)

しかし、iniファイル形式に拘らないのであれば、
構成ファイル(filename.exe.configファイル)を用意しておき、
ConfigurationSettings.AppSettingsプロパティにて取得した方が、
.Net的にはスマートな方法かと思います。


nanashi  2003-04-02 21:51:35  No: 77529

やってみた上での質問なんですかね?
VB.NetではIntegerが32bit、Longが64bitになってるんで そこだけ気をつければ普通に使えたはずですが。


魔界の仮面弁士  2003-04-02 21:52:02  No: 77530

Input#は使えませんよ。>Sayさん

今回のVB.NETなのですから、使うとすれば、"Microsoft.VisualBasic"名前空間の
FileOpen, Input, FileCloseメソッドですよね。
もしくは、.Net Frameworkの"System.IO"名前空間でしょうか。

また、もしも質問がVB6であったとしても、iniファイルの読み込みに
Input # ステートメントを使うのは、避けた方が良いと思います。
使うとすれば、Line Input # ステートメントか、Input関数あたりが適当かと。


ZZZ  2003-04-04 03:14:31  No: 77531

実際に以下の様に作成してみたのですが読み取れません。どこかおかしいところありますか?

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 Long

Public Function GetIni(ByVal section As String, ByVal Key As String,  ByVal DefaultString As String) As String

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

        'INIファイル名取得
        nFileName = GetAppPath()
        nFileName = nFileName & "\XXX.ini"

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

        Ret = GetPrivateProfileString(section, Key, DefaultString, _
           strTemp, intLen, nFileName)

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

    End Function

    Private Function GetAppPath() As String
        Dim fi As New System.IO.FileInfo( _
            System.Reflection.Assembly.GetExecutingAssembly.Location)
        Return fi.DirectoryName
    End Function


魔界の仮面弁士  2003-04-04 04:01:43  No: 77532

VB6時代の宣言をそのまま真似ても駄目ですよ。
先に、
> VB.NetではIntegerが32bit、Longが64bitになってるんで そこだけ気をつければ普通に使えたはずですが。
という回答があったはずですか、「気をつけ」ていなかったみたいですね。(^_^;)

LongをIntegerに修正して、Declareステートメントの記述を

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 Integer, ByVal iniFilename As String) As Integer

のようにするか、もしくは DllImport 属性を使って、

Imports System.Runtime.InteropServices
'   :
'   :
<DllImport("KERNEL32.DLL", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Public Shared Function GetPrivateProfileString _
   (ByVal lpAppName As String, ByVal lpKeyName As String, _
    ByVal lpDefault As String, ByVal lpReturnedString As String, _
    ByVal nSize As Integer, ByVal iniFilename As String) As Integer
End Function

のように宣言してみてください。


魔界の仮面弁士  2003-04-04 04:31:49  No: 77533

ありゃ。ExactSpellingの指定が逆でした。m(_ _)m

> <DllImport("KERNEL32.DLL", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
ではなく、
  <DllImport("KERNEL32.DLL", CharSet:=CharSet.Auto, ExactSpelling:=False)> _
か、もしくは、記述を省略して
  <DllImport("KERNEL32.DLL", CharSet:=CharSet.Auto)> _
のようにして下さい。

# まぁ、Declareのままで十分なのですけれどね。


ZZZ  2003-04-04 17:50:06  No: 77534

魔界の仮面弁士さんありがとうございました。
Integerになおしてやってみたらできました。
まだVB.netをはじめたばかりでいま色々と戸惑いながらやってます。
また、わからないことがありましたらご教授お願いします。m(_ _)m


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

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






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