VBでINIファイルから文字列を取得したりするときにAPI関数のGetPrivatefileStringとかWritePrivateProfileStringがありましたが、VB.netで同様のことがしたいのですが教えて下さい。
API関数はVB6独自の機能ではありません。
API関数の使用法は原則として言語に依存しません。
(当然、コーディングは言語に依存しますが・・・。)
また、iniファイルはただのテキストですから、
やろうと思えば、APIを使わず
Open,Input#,Close,あるいはFileSystemObjectで
操作することも可能です。
VB.NET でも、Get/WritePrivateProfileString API を呼び出す事はできます。
(DllImport属性、もしくはDeclareステートメントにて定義します)
しかし、iniファイル形式に拘らないのであれば、
構成ファイル(filename.exe.configファイル)を用意しておき、
ConfigurationSettings.AppSettingsプロパティにて取得した方が、
.Net的にはスマートな方法かと思います。
やってみた上での質問なんですかね?
VB.NetではIntegerが32bit、Longが64bitになってるんで そこだけ気をつければ普通に使えたはずですが。
Input#は使えませんよ。>Sayさん
今回のVB.NETなのですから、使うとすれば、"Microsoft.VisualBasic"名前空間の
FileOpen, Input, FileCloseメソッドですよね。
もしくは、.Net Frameworkの"System.IO"名前空間でしょうか。
また、もしも質問がVB6であったとしても、iniファイルの読み込みに
Input # ステートメントを使うのは、避けた方が良いと思います。
使うとすれば、Line Input # ステートメントか、Input関数あたりが適当かと。
実際に以下の様に作成してみたのですが読み取れません。どこかおかしいところありますか?
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
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
のように宣言してみてください。
ありゃ。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のままで十分なのですけれどね。
魔界の仮面弁士さんありがとうございました。
Integerになおしてやってみたらできました。
まだVB.netをはじめたばかりでいま色々と戸惑いながらやってます。
また、わからないことがありましたらご教授お願いします。m(_ _)m
ツイート | ![]() |