Excel VBA 对配置文件ini的读写操作(及VS2010 VB)

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDamogu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值