读写ini的四个函数
'文件名SourceDB.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'以下两个函数,读/写ini文件,固定节点setting,in_key为写入/读取的主键
'仅仅针对是非值
'Y:yes,N:no,E:error
Public Function GetIniTF(ByVal In_Key As String) As Boolean
On Error GoTo GetIniTFErr
GetIniTF = True
Dim GetStr As String
GetStr = VBA.String(128, 0)
GetPrivateProfileString "Setting", In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
If GetStr = "1" Then
GetIniTF = True
GetStr = ""
Else
GoTo GetIniTFErr
End If
Exit Function
GetIniTFErr:
Err.Clear
GetIniTF = False
GetStr = ""
End FunctionPublic Function WriteIniTF(ByVal In_Key As String, ByVal In_Data As Boolean) As Boolean
On Error GoTo WriteIniTFErr
WriteIniTF = True
If In_Data = True Then
WritePrivateProfileString "Setting", In_Key, "1", App.Path & "\SourceDB.ini"
Else
WritePrivateProfileString "Setting", In_Key, "0", App.Path & "\SourceDB.ini"
End If
Exit Function
WriteIniTFErr:
Err.Clear
WriteIniTF = False
End Function
'以下两个函数,读/写ini文件,不固定节点,in_key为写入/读取的主键
'针对字符串值
'空值表示出错
Public Function GetIniStr(ByVal AppName As String, ByVal In_Key As String) As String
On Error GoTo GetIniStrErr
If VBA.Trim(In_Key) = "" Then
GoTo GetIniStrErr
End If
Dim GetStr As String
GetStr = VBA.String(128, 0)
GetPrivateProfileString AppName, In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
If GetStr = "" Then
GoTo GetIniStrErr
Else
GetIniStr = GetStr
GetStr = ""
End If
Exit Function
GetIniStrErr:
Err.Clear
GetIniStr = ""
GetStr = ""
End FunctionPublic Function WriteIniStr(ByVal AppName As String, ByVal In_Key As String, ByVal In_Data As String) As Boolean
On Error GoTo WriteIniStrErr
WriteIniStr = True
If VBA.Trim(In_Data) = "" Or VBA.Trim(In_Key) = "" Or VBA.Trim(AppName) = "" Then
GoTo WriteIniStrErr
Else
WritePrivateProfileString AppName, In_Key, In_Data, App.Path & "\SourceDB.ini"
End If
Exit Function
WriteIniStrErr:
Err.Clear
WriteIniStr = False
End Function
'文件名SourceDB.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'以下两个函数,读/写ini文件,固定节点setting,in_key为写入/读取的主键
'仅仅针对是非值
'Y:yes,N:no,E:error
Public Function GetIniTF(ByVal In_Key As String) As Boolean
On Error GoTo GetIniTFErr
GetIniTF = True
Dim GetStr As String
GetStr = VBA.String(128, 0)
GetPrivateProfileString "Setting", In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
If GetStr = "1" Then
GetIniTF = True
GetStr = ""
Else
GoTo GetIniTFErr
End If
Exit Function
GetIniTFErr:
Err.Clear
GetIniTF = False
GetStr = ""
End FunctionPublic Function WriteIniTF(ByVal In_Key As String, ByVal In_Data As Boolean) As Boolean
On Error GoTo WriteIniTFErr
WriteIniTF = True
If In_Data = True Then
WritePrivateProfileString "Setting", In_Key, "1", App.Path & "\SourceDB.ini"
Else
WritePrivateProfileString "Setting", In_Key, "0", App.Path & "\SourceDB.ini"
End If
Exit Function
WriteIniTFErr:
Err.Clear
WriteIniTF = False
End Function
'以下两个函数,读/写ini文件,不固定节点,in_key为写入/读取的主键
'针对字符串值
'空值表示出错
Public Function GetIniStr(ByVal AppName As String, ByVal In_Key As String) As String
On Error GoTo GetIniStrErr
If VBA.Trim(In_Key) = "" Then
GoTo GetIniStrErr
End If
Dim GetStr As String
GetStr = VBA.String(128, 0)
GetPrivateProfileString AppName, In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
If GetStr = "" Then
GoTo GetIniStrErr
Else
GetIniStr = GetStr
GetStr = ""
End If
Exit Function
GetIniStrErr:
Err.Clear
GetIniStr = ""
GetStr = ""
End FunctionPublic Function WriteIniStr(ByVal AppName As String, ByVal In_Key As String, ByVal In_Data As String) As Boolean
On Error GoTo WriteIniStrErr
WriteIniStr = True
If VBA.Trim(In_Data) = "" Or VBA.Trim(In_Key) = "" Or VBA.Trim(AppName) = "" Then
GoTo WriteIniStrErr
Else
WritePrivateProfileString AppName, In_Key, In_Data, App.Path & "\SourceDB.ini"
End If
Exit Function
WriteIniStrErr:
Err.Clear
WriteIniStr = False
End Function
'Parameter Values
'Here is some terminology you will need to remember when dealing with INI files.'AppName - Heading of the section in an INI file.
'KeyName - Key within a heading.
'Value - Value either being set or retrieved.Public Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpfilename As String) As LongPublic 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 LongPublic Declare Function GetProfileInt Lib "Kernel32" Alias "GetProfileIntA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal nDefault As Long) As LongPublic Declare Function GetProfileString Lib "Kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As LongPublic Declare Function WriteProfileString Lib "Kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As LongPublic Declare Function GetPrivateProfileInt Lib "Kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpfilename As String) As Long'读整数值
'例子
'Dim iMyValue As Integer
'iMyValue = GetPrivateProfileInt("足彩大赢家", "投注期号", App.Path & "\dyj.ini", 0)Public Function iReadINI(sAppName As String, sKeyName As String, sFileName As String, iDefault As Integer) As Integer
iReadINI = GetPrivateProfileInt(sAppName, ByVal sKeyName, iDefault, sFileName)
End Function'读字符串值
'例子
'Dim sMyValue As String
'sMyValue = sReadINI("足彩大赢家", "投注期号", App.Path & "\dyj.ini")Public Function sReadINI(sAppName As String, sKeyName As String, sFileName As String) As String
Dim sReturn As String
sReturn = String(255, Chr(0))
sReadINI = Left(sReturn, GetPrivateProfileString(sAppName, ByVal sKeyName, "", sReturn, Len(sReturn), sFileName))
End Function'写入 INI 文件
'例子
'WriteINI "足彩大赢家", "投注期号", Combo4.Text, App.Path & "\dyj.ini"Public Sub WriteINI(sAppName As String, sKeyName As String, sNewString As String, sFileName As String)
Dim R As Integer
R = WritePrivateProfileString(sAppName, sKeyName, sNewString, sFileName)
End Sub'----------------------------------------------------------
'删除键值
'例子
'RemoveKeyName "VBTT", "Download Directory", App.Path & "\VBTT.INI"'Public Sub RemoveKeyName(sAppName As String, sKey As String, sFileName As String)
' Dim R As Integer
' R = RemovePrivateProfileString(sAppName, sKey, 0&, sFileName)
'End Sub'删除程序名段落
'例子
'RemoveAppNameSection "VBTT", App.Path & "\VBTT.INI"
'Public Sub RemoveAppNameSection(sAppName As String, sFileName As String)
' Dim R As Integer
' R = RemovePrivateProfileString(sAppName, 0&, 0&, sFileName)
'End Sub
keyword1=valuel
keyword2=value2
… …
[section2]
keyword1=value1
keyword2=value2
… …其 中, 如 果 等 号 右 边 无 任 何 内 容 (即 value 为 空), 那 就 表 示 Windows 应 用 程 序 已 为 该 关 键 词 指 定 了 缺 省 值, 如 果 在 整 个 文 件 中 找 不 到 某 个 关 键 词 (或 整 个 一 部 分), 那 同 样 表 示 为 它 们 指 定 了 缺 省 值。 各 个 部 分 所 出 现 的 顺 序 是 无 关 紧 要 的, 在 每 一 个 部 分 里, 各 个 关 键 词 的 顺 序 同 样 也 无 关 紧 要。 读 写 INI 文 件 通 常 有 两 种 方 式 : 一 是 在 Windows 中 用 “记 事 本” (Notepad) 对 其 进 行 编 辑, 比 较 简 单, 无 需 赘 述; 二 是 由 Windows 应 用 程 序 读 写 INI 文 件, 通 常 是 应 用 程 序 运 行 时 读 取 INI 文 件 中 的 信 息, 退 出 应 用 程 序 时 保 存 用 户 对 运 行 环 境 的 某 些 修 改。 关 键 词 的 值 的 类 型 多 为 字 符 串 或 整 数 型, 应 分 两 种 情 况 读 写。 为 了 使 程 序 具 有 可 维 护 性 和 可 移 植 性, 最 好 把 对 INI 文 件 的 读 写 封 装 在 一 个 模 块 (RWINI.BAS) 中, 在 RWI-NI.BAS 中 构 造 GetIniS 和 GetIniN 函 数 以 及 SetIniS 和 Se-tIniN 过 程, 在 这 些 函 数 和 过 程 中 需 要 使 用 WindowsAPI 的 “GetPrivateprofileString”、 “GetPrivateProfileInt” 和 “WritePrivateProfileString” 函 数。 RWINI.BAS 模 块 的 程 序 代 码 如 下 :在 General-Declearation 部 分 中 声 明 使 用 到 的 Windows API 函 数 :Declare Function GetprivateprofileString Lib “Ker-nel” (ByVal lpAppName As String,
ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpRetrm-StringAs
String, ByVal cbReturnString As Integer, ByVal Filename As String) As Integer
Declare Function GetPrivatePfileInt Lib “Kernel” (ByVal lpAppName As String,
ByVal lpKeyName As String, ByVal lpDefault As Integer, ByVal Filename As String) As
Integer
Declare Funciton WritePrivateprofileString Lib “Kernel” (ByVal lpApplicationName
As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lplFileName
As String) As Integer
Function GetIniS(ByVal SectionName As String, ByVal KeyWord As String, ByValDefString
As String) As String
Dim ResultString As String *144, Temp As Integer
Dim s As String, i As Integer
Temp%=GetPrivateProfileString(SectionName, KeyWord, “”, ResultString, 144, AppProfileName())
‘检 索 关 键 词 的 值
If Temp%> 0 Then ‘关 键 词 的 值 不 为 空
s=“”
For i=1 To 144
If Asc(Mid$(ResultString, i, 1)) =0 Then
Exit For
Else
s=s & Mid$(ResultString, i, 1)
End If
Next
Else
Temp%=WritePrivateProfilesString(sectionname, KeyWord, DefString, ppProfileName())
‘将 缺 省 值 写 入 INI 文 件
s=DefString
End If
GetIniS=s
End Function
Function GetIniN(ByVal SectionName As String, ByVal KeyWord As String, ByValDefValue
As Ineger) As Integer
Dim d As Long, s As String
d=DefValue
GetIniN=GetPrivate ProfileInt(SectionName,
KeyWord, DefValue, ppProfileName())
If d <> DefValue Then
s=“” &d
d=WritePrivateProfileString(SectionName,
KeyWord, s, AppProfileName())
End If
End Function
Sub SetIniS(ByVal SectionName As String, BtVa KeyWord As String, ByVal ValStr
As String)
Dim res%
res%=WritePrivateprofileString(SectionName, KeyWord, ValStr, AppProfileName())
End Sub
Sub SetIniN(ByVal SectionName As String, ByVal KeyWord As String, ByVal ValInt
As Integer)
Dim res%, s$
s$=Str$(ValInt)
res%=WriteprivateProfileString(SectionName, KeyWord, s$, AppProfileName())
End SubSectionName 为 每 一 部 分 的 标 题, KeyWord 为 关 键 词, GetIniS 和 GetIniN 中 的 DefValue 为 关 键 词 的 缺 省 值, SetIniS 和 SetIniN 的 ValStr 和 ValInt 为 要 写 入 INI 文 件 的 关 键 词 的 值。 为 了 能 更 好 地 说 明 如 何 使 用 以 上 函 数 和 过 程, 下 面 举 两 个 实 例。 实 例 1:开 发 应 用 程 序 通 常 要 使 用 数 据 库 和 其 它 一 些 文 件, 这 些 文 件 的 目 录 (包 括 路 径 和 文 件 名) 不 应 在 程 序 中 固 定, 而 是 保 存 在 INI 文 件 中, 程 序 运 行 时 由 INI 文 件 中 读 入。 读 入 数 据 库 文 件 的 代 码 如 下 :Dim Databasename As String
Databasename=GetIniS(“数 据 库”, “职 工”, “”)
If DatabaseName=“” Then DatabaseName=InputBox(“请 输 入 数 据 库 《职 工》 的 目 录”),
App.Title)’ 也 可 通 过 “文 件 对 话 框” 进 行 选 择
On Error Resume Next
Set db=OpenDatabas(DatabaseName)
If Err <> 0 Then
MsgBox“打 开 数 据 库 失 败 !”, MB-
ICONSTOP, App.Title:Goto ErrorProcessing
Else
SetIniS“数 据 库”, “职 工”, DatabaseName
End If
On Error GoTo 0
… …实 例 2:为 了 方 便 用 户 操 作, 有 时 需 要 保 存 用 户 界 面 的 某 些 信 息, 例 如 窗 口 的 高 度 和 宽 度 等。 装 载 窗 体 时, 从 INI 文 件 中 读 入 窗 体 高 度 和 宽 度, 卸 载 窗 体 时 将 窗 体 当 前 高 度 和 宽 度 存 入 INI 文 件, 代 码 如 下 :Sub Form1_Load()
… …
Forml.Height=GetIniN(“窗 体 1”, “高 度”, 6000)
Form1.Width=GetIniN(“窗 体 1”, “高 度”, 4500)
End Sub
… …
Sub Form1_Unload()
… …
SetIniN“窗 体 1”, “高 度”, Me.Height
SetIniN“窗 体 1,” 宽 度 “, Me.Width
… …
;******************************************************************************
; ServerHost.INI
;******************************************************************************
[SYSTEM]
Version=Version 1.00
Date=2002/03/05[ServerINI]
Provider=SQLOLEDB.1
User ID=User-xxx
Password=Psw_xxx
Persist Security Info=False
Initial Catalog=xxx_MIS
Data Source=xxx-SERVER2、程序部分(cls文件):
Option Explicit'' 声明 API 函数
Private 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 lpFileName As String) As LongPrivate Const BUFF_SIZE = 512 '' 最大字符数(读取字符时用)
'' File 1
Private Function APIGetPrivateProfileString( _
ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpFileName As String, _
Optional ByVal lpDefault As String = "", _
Optional ByVal bFlag As Boolean = True _
) As StringOn Error GoTo ErrorProcess
Dim szBuff As String * BUFF_SIZE
Dim nRet As Integer '' 调用 API 函数取得相应字段
nRet = GetPrivateProfileString(lpAppName, lpKeyName, lpDefault & Chr$(0), szBuff, _
BUFF_SIZE, lpFileName)
'' 调用程序段,转换成可识别的符号
APIGetPrivateProfileString = IIf(bFlag, cBinToStr(szBuff), szBuff)
'' 正常退出
Exit Function
ErrorProcess:
APIGetPrivateProfileString = ""
Exit Function
End Function
'' 将特殊格式转换成可识别的符号
Private Function cBinToStr( _
ByVal szString As String _
) As StringOn Error GoTo ErrorProcess
Dim nPos As Integer
Dim strString As String nPos = InStr(szString, Chr$(0))
If nPos <> 0 Then
strString = Mid$(szString, 1, nPos - 1)
Else
strString = ""
End If
cBinToStr = strString
Exit Function
ErrorProcess:
cBinToStr = ""
Exit FunctionEnd Function
'' 初始化部分参数
Private Sub Class_Initialize()
Dim strFilePath As String
'Dim iNum As Integer
Dim strBuff As String
Dim strProvider As String
Dim strUserID As String
Dim strPSW As String
Dim strPerSecInf As String
Dim strInitCatalog As String
Dim strDataSrc As String
Dim strTmp As String
G_ADO_ConStr = ""
'strFilePath = "..\ini\ServerHost.INI"
'strFilePath = "ini\ServerHost.INI"
strFilePath = "C:\ini\ServerHost.INI"
If strFilePath = "" Then Exit Sub
strProvider = APIGetPrivateProfileString("ServerINI", "Provider", strFilePath, True)
strUserID = APIGetPrivateProfileString("ServerINI", "User ID", strFilePath, True)
strPSW = APIGetPrivateProfileString("ServerINI", "Password", strFilePath, "", True)
strPerSecInf = APIGetPrivateProfileString("ServerINI", "Persist Security Info", strFilePath, "", True)
strInitCatalog = APIGetPrivateProfileString("ServerINI", "Initial Catalog", strFilePath, "", True)
strDataSrc = APIGetPrivateProfileString("ServerINI", "Data Source", strFilePath, "", True)
strTmp = "Provider = " & strProvider & ";"
strTmp = strTmp & "User ID = " & strUserID & ";"
strTmp = strTmp & "Password = " & strPSW & ";"
strTmp = strTmp & "Persist Security Info = " & strPerSecInf & ";"
strTmp = strTmp & "Initial Catalog = " & strInitCatalog & ";"
strTmp = strTmp & "Data Source = " & strDataSrc
' strTmp = "Provider = " & "SQLOLEDB.1" & ";"
' strTmp = strTmp & "User ID = " & "bclhr" & ";"
' strTmp = strTmp & "Password = " & "BclHr1234" & ";"
' strTmp = strTmp & "Persist Security Info = " & "False" & ";"
' strTmp = strTmp & "Initial Catalog = " & "HR_MIS" & ";"
' strTmp = strTmp & "Data Source = " & "HR-SERVER"
'"Provider=SQLOLEDB.1;User ID=bclhr;Password=BclHr1234;Persist Security Info=False;Initial Catalog=HR_MIS;Data Source=HR-SERVER" G_ADO_ConStr = strTmpEnd SubPublic Function getStrAdo() As String
getStrAdo = G_ADO_ConStr
End Function