Excel VBA 读写ini文件
Private Declare Function GetPrivateProfileString _
Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) _
As Long
Private Declare Function WritePrivateProfileString _
Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) _
As Long
Sub WriteIniFile()
'@Param1: Section
'@Param2: Item
'@Param3: Value
'@Param4: ini file path
Dim tmpWriteOk As Long
tmpWriteOk = WritePrivateProfileString("Config", "File", "asdasd1.kon", ThisWorkbook.Path & "\thconf.ini")
End Sub
Sub ReadIniFile()
Dim tmpReadOk As Long
Dim tmpReadValue As String
Dim tmpItem As String
For i = 0 To 35
'Int: 0 -> Str: "00",1->"01"
tmpReadValue = String(255, 0)
'String(255, 0)实际上返回空的字符串。255的意思是字符串重复的次数,0的意思是ASCII为0的字符,因为他不显示,
'所以返回空字符串。如果要返回255个0的话,应该是String(255,"0").
If Len(i) = 1 Then
tmpItem = "0" & CStr(i)
Else
tmpItem = CStr(i)
End If
tmpReadOk = GetPrivateProfileString("Config", tmpItem, "", tmpReadValue, 256, ThisWorkbook.Path & "\thconf.ini")
Debug.Print tmpReadValue
Next
End Sub
VisualStudio 2010 VB Form,Library读写ini文件
'注意点:Any 在Vs2010中VB下是不支持any的,根据需求换成string,object,long等等
Private Declare Function GetPrivateProfileString _
Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) _
As Long
Private Declare Function WritePrivateProfileString _
Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) _
As Long
'@Param:iniPath 路径
Public Function WriteIniFile(ByVal iniPath As String) As Boolean
'@Param1: Section
'@Param2: Item
'@Param3: Value
'@Param4: ini file path
Dim tmpWriteOk As Long
tmpWriteOk = WritePrivateProfileString("Config", "File", "asdasd1.kon", iniPath)
WriteIniFile = True
End Function
'@Param:strIniPath 路径
Public Function ReadIniFile(ByVal strIniPath As String) As Boolean
Dim i As Integer
Dim tmpReadOk As Long
Dim tmpReadValue As String
Dim tmpItem As String
tmpReadValue = LSet(0, 256)
For i = 0 To 35
'Int: 0 -> Str: "00",1->"01"
If Len(CStr(i)) = 1 Then
tmpItem = "0" & CStr(i)
Else
tmpItem = CStr(i)
End If
tmpReadOk = GetPrivateProfileString("Config", tmpItem, "", tmpReadValue, Len(tmpReadValue), strIniPath)
MsgBox(tmpReadValue)
Next
ReadIniFile = True
End Function
关于上述代码,发生了很严重的问题,在实际Debug中打印出来发现读取到的和ini的是一致的,但是在代码中变现出了很大问题,也就是说徒有其形,未有其意,对于上述代码的改进
VB.NET推荐下述代码:
Imports Microsoft.VisualBasic.CompilerServices
Public Class CtrlIni
Public Property iniFilePath As String
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32
Public Function GetINI(ByVal Section As String, ByVal AppName As String, Optional ByVal lpDefault As String = "") As String
Dim Str As String = ""
'首先是这个位置,由0更改为str
Str = LSet(Str, 256)
GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), iniFilePath)
'再一个不同就是返回的时候,不再是直接返回str,而是选择了Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)
'这里很关键,也就是说,如果直接用str后续会出现很难以确定问题出处的bug.
Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)
End Function
Public Function SetINI(ByVal Section As String, ByVal AppName As String, ByVal lpString As String) As Boolean
Try
WritePrivateProfileString(Section, AppName, lpString, iniFilePath)
Catch exception1 As Exception
Return False
End Try
Return True
End Function
End Class