1. 程式人生 > >VBA讀取INI配置檔案各方資料整合

VBA讀取INI配置檔案各方資料整合

VB讀寫ini檔案(1)

自從登錄檔誕生以來ini檔案正在逐漸失去其市場佔有率,然而基於ini檔案的獨立性,致使其還沒有到達退出歷史舞臺的地步,很多應用程式的初始化和一些介面引數的設定仍然很願意從ini檔案中讀取,為了保證操作需用引數對ini檔案的讀取的通明性,建議使用一個模組來完成此工作。注:所有操作呼叫標準的Win API函式來完成。
  Dim Ret As Long
  Dim Start As Long
  Public FileName As String
  Const BufSize = 10240
  Dim buf As String * BufSize
  Private 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
  
  Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  
  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 WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, 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
  
  Public Sub SetValue(ByVal clsName As String, ByVal key As String, ByVal V As String)
   Ret = WritePrivateProfileString(clsName, key, V, FileName)
  End Sub
  
  Public Function GetValue(ByVal clsName As String, ByVal key As String) As String
   Ret = GetPrivateProfileString(clsName, key, "", buf, BufSize, FileName)
   Start = 1
   GetValue = RetStr()
  End Function
  
  Private Function RetStr() As String
   Dim i As Long
   i = InStr(Start, buf, Chr(0))
   If i > Start Then
   RetStr = Mid(buf, Start, i - Start)
   End If
   Start = i + 1
  End Function
  
  至此已經完成了對一個完整的獨立模組的封裝,接下來就來看看怎麼引用(其實看完上面程式就明瞭了)

VB讀寫ini檔案(2)

INI 檔案是什麼樣子?——不會吧,這都不知道。INI 檔案就是 Windows 中常見的以 .ini 為副檔名的檔案,其內部格式和各部分的名稱如下:

   [Section1]
Key1=Value1
Key2=Value2
Key3=Vlaue3

[Section2]
Key1=Value1
Key2=Value5
Key4=Value4
Key5=...

...


  INI 檔案中分若干個段 (Section),每個段中有若干個鍵 (Key) 值 (Value) 對。一個鍵值對儲存一個資訊;段則將屬性類似的一些鍵值對組織在一起。同一個段中不能出現兩次以上同樣的鍵,但不同的段中可以出現相同的鍵。

  現在明白了嗎?要是還不明白,就到 Windows 裡找兩個 INI 檔案看看,文字編輯器就可以開啟的。明白了 INI 檔案就要開始學習怎樣在 VB 中讀寫 INI 了。

  VB 讀寫 INI 檔案,難嗎?不難,因為 Windows 已經為我們做好了一切,我們只需要呼叫它的 API 函式就可以了。為了讀寫 INI 檔案,我們可能用到以下 API 函式:

  GetPrivateProfileInt
  GetPrivateProfileString
  WritePrivateProfileString

  其中 WritePrivateProfileString 是用來向 INI 檔案寫資訊的,而 GetPrivateProfileInt 和 GetPrivateProfileString 則是用來從 INI 檔案中讀資訊的,前者用於讀取整型資料,後者則用於讀取字串型資料。

  上述三個 API 函式在 VB 中的申明和說明如下:

   Private Declare Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileIntA" ( _        ' 返回所讀取的長整型值
     ByVal lpApplicationName As String, _     ' 要讀取的段 (Section) 名稱
     ByVal lpKeyName As String, _             ' 要讀取的的鍵 (Key) 名稱
     ByVal nDefault As Long, _                ' 指定預設值,如果讀取時出錯,則返回該值
     ByVal lpFileName As String) As Long      ' 指定要讀的 INI 檔名

Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" ( _     ' 返回所讀取的字串值的真實長度
     ByVal lpApplicationName As String, _     ' 要讀取的段 (Section) 名稱
     ByVal lpKeyName As Any, _                ' 要讀取的的鍵 (Key) 名稱
     ByVal lpDefault As String, _             ' 指定預設值,如果讀取時出錯,則返回該值
     ByVal lpReturnedString As String, _      ' 指定接收返回值的字串變數
     ByVal nSize As Long, _                   ' 指定允許字串值的最大長度
     ByVal lpFileName As String) As Long      ' 指定要讀的 INI 檔名

Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" ( _   ' 如果成功返回非 0 值,失敗返回 0
     ByVal lpApplicationName As String, _     ' 要寫入的段 (Section) 名稱
     ByVal lpKeyName As Any, _                ' 要寫入的的鍵 (Key) 名稱
     ByVal lpString As Any, _                 ' 要寫入的值 (Value),以字串表示
     ByVal lpFileName As String) As Long      ' 指定要寫的 INI 檔名


  我們的目的是要在 VB 中寫一個讀寫 INI 檔案的類,所以在 VB 中新建一個工程,並新增一個類模組 (Class Module),命令類為 CIniFile,並且將上面的申明新增到類模組中。然後開始為類新增屬性和方法。

  從上面的註釋中,我們可以知道,每次調三個 API 之一都需要指定 INI 檔名。而在我們的 CIniFile 的每一個例項中,應該始終訪問同一個 INI 檔案,所以屬性之一就是檔名:

  Private IniFileName As String

  另外,呼叫 API 的過程中可能會出現錯誤,那麼 CIniFile 應該能提供錯誤資訊,所以定義一個儲存錯誤資訊的變數作為 CIniFile 的第二個屬性

  Public ErrorMsg As String

  由於訪問什麼段、什麼鍵以及寫入什麼值都可以通過引數的形式傳遞給方法,而獲取的值也都可以通過方法的返回值得以,所以不再需要其它屬性了。不過在定義方法之前還需要對屬性進行初始化:

   Private Sub Class_Initialize()
     IniFileName = vbNullString
     ErrorMsg = vbNullString
End Sub


  為了指定 INI 檔名給 CIniFile,需要定義一個方法:

   Public Sub SpecifyIni(FilePathName)
     IniFileName = Trim(FilePathName)
End Sub


  在每次讀寫值之前還需要先判斷是否已經指定了 INI 檔名,不然讀什麼寫什麼啊?

   Private Function NoIniFile() As Boolean
     NoIniFile = True
     If IniFileName = vbNullString Then
         ErrorMsg = "沒有指定 INI 檔案"
         Exit Function
     End If
     ErrorMsg = vbNullString
     NoIniFile = False
End Function


  準備工作完成,現在才是重頭戲,讀寫 INI 檔案。似乎“寫”要簡單一些,就先“寫”吧:

   Public Function WriteString(Section As String, key As String, Value As String) As Boolean
     WriteString = False
     If NoIniFile() Then
         Exit Function
     End If
     If WritePrivateProfileString(Section, key, Value, IniFileName) = 0 Then
         ErrorMsg = "寫入失敗"
         Exit Function
     End If
     WriteString = True
End Function


  該方法在 INI 檔案中寫入一個鍵值,成功返回 True,失敗返回 False。根據 WritePrivateProfileString 的需要,除了檔名這一引數不用提供之外,需要提供段名、鍵名和值三個引數,而且這三個引數當然來自使用者。而 WritePrivateProfileString 是通過返回值是否為 0 來判斷是否成功的,所以可以通過判斷 WritePrivateProfileString 的返回值是否非 0 來返回 True 或 False。

  而讀 INI 就要稍稍麻煩一點了,兩個讀取 INI 檔案的的函式中,讀取字串那個雖然引數多些,但實現起來卻更簡單,所以,先寫這個:

   Public Function ReadString(Section As String, key As String, Size As Long) As String
     Dim ReturnStr As String
     Dim ReturnLng As Long
     ReadString = vbNullString
     If NoIniFile() Then
         Exit Function
     End If
     ReturnStr = Space(Size)
     ReturnLng = GetPrivateProfileString(Section, key, vbNullString, ReturnStr, Size, IniFileName)
     ReadString = Left(ReturnStr, ReturnLng)
End Function


  這個方法在 INI 檔案中讀取一個鍵值,作為字串返回。如果引數 Size 給定的大小不夠,將不能返回完整的值串,但不會有任何提示。

  寫這個函式的關鍵在 ReturnStr 的初始化和取值上。VB 中是不需要對字串進行初始化的,也不需要分配空間。但是這裡如果不將它初始化為一個足夠長的字串,就不能正確返回結果。這和 C 語言的字串有關,就不多說了。ReturnStr 的取值也需要有趣,要使用 Left() 函式將其截斷。如果不截斷,取得的結果字串就會有 Size 那麼長,除了取得的值以外,其餘部分都是用空格填充的。其原因與前面一點相同,與 C 語言的字串有關。當然 Left() 函式也可以使用 Trim() 代替,效果是一樣的。

  最後我們不得不面對這個最麻煩的 ReadInt 方法了。它為什麼麻煩呢?看看現在的函式定義就知道了:

   Public Function ReadInt(Section As String, key As String) As Long
     Dim ReturnLng As Long
     ReadInt = 0
     ReturnLng = GetPrivateProfileInt(Section, key, 0, IniFileName)
     If ReturnLng = 0 Then
         ReturnLng = GetPrivateProfileInt(Section, key, 1, IniFileName)
         If ReturnLng = 1 Then
             ErrorMsg = "不能讀取"
             Exit Function
         End If
     End If
     ReadInt = ReturnLng
End Function


  這個方法在 INI 檔案中讀取一個整數值,失敗時返回 0。考慮到某些鍵的值也可能為 0,故應結合 ErrorMsg 判斷是否成功。

  這個方法中呼叫了兩次 GetPrivateProfileInt,為什麼要這樣呢?因為 GetPrivateProfileInt 如果成功則返回取得的值,如果不成功則返回給定的預設值。這樣就會出現一種情況:如果我給的預設值是 0,GetPrivateProfileInt 函式取得的值也是 0,那麼它是成功還是失敗呢?同樣,如果我給的預設值是 1,GetPrivateProfileInt 函式取得的值也是 1,那就是成功還是失敗呢?既然一次取值無法判斷,那就多取一次,第一次設定預設值為 0,第二次設定預設值為 1,INI 檔案的中值不會跟著我的預設值變吧?!雖然這樣麻煩一些,但畢竟把問題解決了。

  自此,我們終於把一個 CIniFile 寫完了——現在讀寫 INI 檔案再也不需要像寫 CIniFile 一樣考慮許多東西了,CIniFile 已經幫我們做了。
 

VB讀寫ini檔案(3)

我們在製作應用程式時,經常要用到INI檔案,INI檔案是一種非常有用的檔案,它由節、關鍵字和值組成。但是VB並沒有給提供讀取INI檔案的函式。我們可以通過Windows API函式中有相應的函式,來實現讀取INI檔案,但每次使用都必須宣告。

1.讀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
lpApplicationName:   節的名字
lpKeyName:      關鍵字
lpReturnedString:    返回的字串
lpFileName:      ini檔案的名稱

2.寫INI檔案
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
lpApplicationName:   節的名字
lpKeyName:      關鍵字
lpString:      要改變的值
lpFileName:      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 Function

Public 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 Function

Public 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


相關推薦

VBA讀取INI配置檔案各方資料整合

VB讀寫ini檔案(1) 自從登錄檔誕生以來ini檔案正在逐漸失去其市場佔有率,然而基於ini檔案的獨立性,致使其還沒有到達退出歷史舞臺的地步,很多應用程式的初始化和一些介面引數的設定仍然很願意從ini檔案中讀取,為了保證操作需用引數對ini檔案的讀取的通明性,建議使用一個模組來完成此工作。注:所有操作呼叫標

MFC利用系統API讀取INI配置檔案

confing.ini中的內容 [賬號] account=123|456 [是否修理裝備] repair=1   讀取INI字串: CString pourin; GetPrivateProfileString(L"賬號",L"account",NULL,pour

轉 python3 讀取 ini配置檔案

在程式碼中經常會通過ini檔案來配置一些常修改的配置。下面通過一個例項來看下如何寫入、讀取ini配置檔案. 需要的配置檔案是:   1 [path] 2 back_dir = /Users/abc/PycharmProjects/Pythoncoding/projects/ 3 target_

C#讀取ini配置檔案注意的問題

C#和Win32 API函式 C#並不像C++,擁有屬於自己的類庫。C#使用的類庫是.Net框架為所有.Net程式開發提供的一個共有的類庫――.Net FrameWork SDK。雖然.Net FrameWork SDK內容十分龐大,功能也非常強大,但還不能面面俱到,至少它

QSettins讀取INI配置檔案

QSettins讀取INI配置檔案 #include <QSettings> int main() { QString strPath = "usr/test/11.ini"; QSettings* settings = new QSettings(strPath, Q

linux shell 指令碼讀取 ini 配置檔案

linux shell 指令碼讀取 ini 配置檔打碼如下: #!/bin/bash configFile="./config.ini" function ReadINIfile() { Key=$1 Section=$2 Configfile=$

java軟體托盤MenuItem 顯示中文出現框框亂碼、讀取ini配置檔案亂碼

1、java軟體托盤顯示中文出現框框亂碼 環境: windowXP+eclipse 程式碼片段: tray = SystemTray.getSystemTray();ImageIcon icon = new ImageIcon("images/saomiao.png"); 

shell指令碼讀取ini配置檔案的值

[comon] ids=com1,com2,com3 files=profilefile [com1] key="name" file="test" [com2] key="name1" file="test" [com3] key="name2" file

Java 讀取 INI 配置檔案的方法

INI 配置檔案是 Windows 以前非常喜歡使用的一種配置檔案格式,形如: [GLOBAL] path = c:\appdata [JDBC] driver = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:

Shell指令碼讀取ini配置檔案例項教程

分享下Shell指令碼讀取ini配置檔案的實現程式碼,分為簡單版與複雜版二個版本。 一、簡單版 參考stackoverflow的例子,改了一個出來: while IFS='= ' read var val do     if [[ $var == \[*] ]]     t

Python + Selenium自動化測試 -- 讀取ini配置檔案

Python支援多種配置檔案的讀寫,本文僅介紹其中一種–ini檔案的讀寫。Python中configparser【注意c小寫】類支援讀寫ini檔案。步驟如下: 1、 在專案下新建一資料夾,名為config,在此資料夾下新建一file型別的檔案:config.i

linux shell 指令碼讀取 ini 配置檔案(命令部分詳解)

wanxiaoderen: 這句 判斷理解難度略高,查資料半天后,我來解釋下 (awk的使用(不瞭解的可以掃盲)http://blog.chinaunix.net/uid-23302288-id-3785105.html) ReadINI=`awk -F '=' '

java讀取配置檔案.properties資料

util.properties testkey=test123 java_web: import java.util.Properties; import org.springframework.stereotype.Component; /** * 獲取配置檔案資訊

程式讀取配置檔案資料顯示在頁面上

1.首先在配置檔案中增加要讀取的資料 cas.cmCustPayment.receiptInvoiceName=\u9996\u94A2\u667A\u65B0\u8FC1\u5B89\u7535\u78C1\u6750\u6599\u6709\u9650\u516C\u53F8 ca

基於ConfigManager讀取配置檔案資料

獲取配置檔案的配置資訊(比如資料庫的配置資訊,redis的配置資訊) 如何讓使用者只能建立一個ConfigManager?單例模式:(1)把構造方法私有 (2)程式提供給別人唯一物件 單例模式的兩種實現方式:餓漢方式 懶漢方式(執行緒不安全) 提供給別人一個唯一的C

GetPrivateProfileString 讀取當前目錄的 ini 配置檔案失敗的解決辦法

函式介紹  GetPrivateProfileString 有兩種,我選用的是 GetPrivateProfileStringA 函式讀取配置檔案,以下是用這個函數出現讀取失敗的解決方案 解決辦法 讀當前目錄必須寫成 "./Param.ini",只有 1個小

VS 儲存INI配置檔案讀取配置檔案

INI檔案簡介 在我們寫程式時,總有一些配置資訊需要儲存下來,以便在下一次啟動程式完成初始化,這實際上是一種類持久化。將一些資訊寫入INI檔案(initialization file)中,可完成簡單的持久化支援。 Windows提供了API介面用於操作INI檔案,其支援

【Xml配置檔案資料讀取

在開發中的可變配置項常使用xml檔案的方式進行配置和讀取: 假設下面有一個配置檔案: <?xml version="1.0" encoding="utf-8" ?> <root> <schoolId>00001</schoolI

ini 配置檔案的格式 及讀取

概述 在程式中經常要用到設定或者其他少量資料的存檔,以便程式在下一次執行的時候可以使用,比如說儲存本次程式執行時視窗的位置、大小、一些使用者設定的資料等等,在 Dos 下程式設計的時候,我們一般自己產生一個檔案,由自己把這些資料寫到檔案中,然後在下一次執行的時候再讀出

Python讀取修改ini配置檔案[ConfigParser]

使用到的包:ConfigParser 文件 需求 寫個專案,用到資料庫,多個地方使用,不能硬編碼。很類似java的properties檔案 Python支援ini檔案的讀取 ini檔案 db_config.ini 123