二十四史简介——梁书

《梁书》记载自梁武帝萧衍建国至梁敬帝萧方智亡国共五十六年间的历史,是姚察及其子姚思廉两代人辛勤撰写完成的。
姚察,字伯审,吴兴武康人,南朝历史学家。
历经梁、陈、隋三朝,于陈朝任秘书监、领大著作、吏部尚书等职,于隋朝任秘书丞。入隋后于文帝开皇九年又受命编撰梁、陈两代历史,未竟而卒。临终时遗命,嘱其子姚思廉继续完成撰史工作。
姚思廉,字简之,姚思廉在撰史工作中,充分利用了其父已完成的史著旧稿。
自贞观三年至贞观十年,历时七年最终完成了《梁书》与《陈书》的撰写工作。
姚察及姚思廉父子虽为史学家,但都有较深厚的文字素养,于史文撰著方面,文字简洁朴素,力戒追求辞藻的华丽与浮泛,继承了司马迁及班固的文风与笔法,在南朝诸史中是难能可贵的。

文件系统对象(File System Object)函数系列之一

Public Function GetExeVersion(ByVal sFullName As String) As String ‘获取可执行文件版本号
Dim FSO As Object
GetExeVersion = “”
If Not FileExist(sFullName) Then Exit Function
Set FSO = CreateObject(“Scripting.FileSystemObject”)
GetExeVersion = FSO.GetFileVersion(sFullName)
Set FSO = Nothing
End Function

Public Function GetExeInfo(ByVal sFullName As String) As String ‘获取可执行文件的信息
Dim FSO As Object
GetExeInfo = “”
If Not FileExist(sFullName) Then Exit Function
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Dim oFile As Object
Set oFile = FSO.GetFile(sFullName)
GetExeInfo = oFile.Size ‘Type/Attributes/Name/Path .etc
Set FSO = Nothing
End Function

Public Function GetWindows() As String ‘获取 Windows
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
GetWindows = FSO.GetSpecialFolder(0)
Set FSO = Nothing
End Function

Public Function GetSystem() As String ‘获取 System
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
GetSystem = FSO.GetSpecialFolder(1)
Set FSO = Nothing
End Function

Public Function GetTemporary() As String ‘获取 Temporary
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
GetTemporary = FSO.GetSpecialFolder(2)
Set FSO = Nothing
End Function

Public Function GetFileList(ByVal sFolder As String) As String ‘获取文件夹本级内所有文件
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Dim oFolder As Object, oItem As Object, oCollection As Object
Dim sList As String
If FSO.FolderExists(sFolder) Then
Set oFolder = FSO.GetFolder(sFolder)
Set oCollection = oFolder.Files
‘Debug.Print oCollection.Count
For Each oItem In oCollection
sList = sList & oItem.Name
sList = sList & “|”
Next
GetFileList = sList
Else
GetFileList = “”
End If
Set FSO = Nothing
End Function

Public Function GetFolderList(ByVal sFolder As String) As String ‘获取文件夹下一级所有子文件夹
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Dim oFolder As Object, oItem As Object, oCollection As Object
Dim sList As String
If FSO.FolderExists(sFolder) Then
Set oFolder = FSO.GetFolder(sFolder)
Set oCollection = oFolder.SubFolders
‘Debug.Print oCollection.Count
For Each oItem In oCollection
sList = sList & oItem.Name
sList = sList & “|”
Next
GetFolderList = sList
Else
GetFolderList = “”
End If
Set FSO = Nothing
End Function

Public Function GetDrivesList() As String
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Dim oItem As Object, oCollection As Object
Dim sList As String
Set oCollection = FSO.Drives
For Each oItem In oCollection
‘Debug.Print oItem.SerialNumber
sList = sList & oItem.DriveLetter
sList = sList & “|”
Next
GetDrivesList = sList
Set FSO = Nothing
End Function

二十四史简介——南齐书

《南齐书》记述南朝萧齐王朝自齐高帝建元元年至齐和帝中兴二年,共二十三年史事,是现存关于南齐最早的纪传体断代史。原名《齐书》,至宋代为区别于李百药所著《北齐书》,改称为《南齐书》,撰著者为萧子显。
萧子显,字景阳,南朝历史学家、文学家。出身皇族,萧子显博学多识,长于写作,又是自齐入梁的贵族人物,对南齐许多史事、王室情况是熟悉的或是亲自经历过的,加之梁朝取代南齐,未经重大战乱,许多图书文籍得以保存,都为萧子显撰著史书提供了有利条件。
《南齐书》现存五十九卷,其中帝纪八卷,志十一卷,列传四十卷。
所缺一卷为《自序》。
《南齐书》文字比较简洁,文笔流畅,叙事完备。列传的撰写,继承了班固《汉书》的类叙法,又借鉴沈约《宋书》的代叙法,能于一传中列述较多人物,避免人各一传不胜其烦的弊病。又书中各志及类传,除少数外,大都写有序文,借以概括全篇内容,提示写作主旨。

注册表(Registry)函数系列之一

Option Explicit
‘注册表操作
Public Declare Function RegCloseKey Lib “advapi32.dll” (ByVal hkey As Long) As Long
Private Declare Function RegCreateKey Lib “advapi32.dll” Alias “RegCreateKeyA” (ByVal hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegOpenKey Lib “advapi32.dll” Alias “RegOpenKeyA” (ByVal hkey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegQueryValueEx Lib “advapi32.dll” Alias “RegQueryValueExA” (ByVal hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Public Declare Function RegSetValueEx Lib “advapi32.dll” Alias “RegSetValueExA” (ByVal hkey&, ByVal lpValueName$, ByVal Reserved&, ByVal dwType&, ByVal lpData$, ByVal cbData&) As Long
Private Declare Function RegSetValue Lib “advapi32.dll” Alias “RegSetValueA” (ByVal hkey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Function RegDeleteValue Lib “advapi32.dll” Alias “RegDeleteValueA” (ByVal hkey As Long, ByVal lpValueName As String) As Long
Public Declare Function RegOpenKeyEx Lib “advapi32” Alias “RegOpenKeyExA” (ByVal hkey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Public Declare Function RegCreateKeyEx Lib “advapi32.dll” Alias “RegCreateKeyExA” (ByVal hkey&, ByVal lpSubKey$, ByVal Reserved&, ByVal lpClass$, ByVal dwOptions&, ByVal samDesired&, ByVal SecAtts&, phkResult&, lpdwDisp&) As Long
Private Declare Function RegDeleteKey Lib “advapi32.dll” Alias “RegDeleteKeyA” (ByVal hkey As Long, ByVal lpSubKey As String) As Long
Public Declare Function SHDeleteKey Lib “shlwapi.dll” Alias “SHDeleteKeyA” (ByVal hkey As Long, ByVal pszSubKey As String) As Long

Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006
Public Const KEY_ALL_ACCESS = (&H1F0000 Or &H1 Or &H2 Or &H4 Or &H8 Or &H10 Or &H20) And (Not &H100000)
Public Const REG_NONE = (0)
Public Const REG_SZ = (1) ‘REG_SZ ——键值存储为字符串值
Public Const REG_EXPAND_SZ = (2)
Public Const REG_BINARY = (3) ‘REG_BINARY ——键值存储为二进制值
Public Const REG_DWORD = (4) ‘REG_DWORD ——键值存储为DWORD值(双字)
Public Const REG_DWORD_BIG_ENDIAN = (5)
Public Const REG_LINK = (6)
Public Const REG_MULTI_SZ = (7)
Public Const REG_RESOURCE_LIST = (8)
Public Const REG_FULL_RESOURCE_DESCRIPTOR = (9)
Public Const REG_RESOURCE_REQUIREMENTS_LIST = (10)

Function RegQueryStringValue(ByVal hkey As Long, ByVal sValueName As String) As String
On Error Resume Next
Dim lResult As Long, lValueType As Long, sBuf As String, lDataBufSize As Long
‘retrieve nformation about the key
lResult = RegQueryValueEx(hkey, sValueName, 0, lValueType, ByVal 0, lDataBufSize)
If lResult = 0 Then
If lValueType = REG_SZ Then
‘Create a buffer
sBuf = String(lDataBufSize, Chr$(0))
‘retrieve the key’s content
lResult = RegQueryValueEx(hkey, sValueName, 0, 0, ByVal sBuf, lDataBufSize)
If lResult = 0 Then
‘Remove the unnecessary chr$(0)’s
‘RegQueryStringValue = Left$(sBuf, InStr(1, sBuf, Chr$(0)) – 1)
‘Avoid making mistakes when chr$(0) is zero
RegQueryStringValue = GetAPIString(sBuf)
End If
ElseIf lValueType = REG_BINARY Then
Dim sData As Integer
‘retrieve the key’s value
lResult = RegQueryValueEx(hkey, sValueName, 0, 0, sData, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = sData
End If
End If
End If
On Error GoTo 0
End Function

Function GetString(ByVal hkey As Long, sPath As String, ByVal sValue As String, ByVal sApp As Variant, ByVal sIniFile As Variant) ‘从注册表读取数据, 如果失败则从初始化文件读取
On Error Resume Next
Dim lResult1, lResult2
‘Open the key
lResult1 = RegOpenKey(hkey, sPath, lRet)
‘Get the key’s content
lResult2 = RegQueryStringValue(lRet, sValue)
GetString = lResult2
‘Close the key
RegCloseKey lRet
On Error GoTo 0
‘OS is diversity, determine if registry success
If IsMissing(sApp) Then Exit Function
If IsMissing(sIniFile) Then Exit Function
If lResult1 = 0 And Len(lResult2) > 0 And Not ChineseExist(lResult2) Then Exit Function ‘含汉字字符串时不一定对
On Error Resume Next
‘Read ini file, when operating Registry is fail.
GetString = ReadIniFile(sApp, sValue, sIniFile)
On Error GoTo 0
End Function

Sub SaveString(ByVal hkey As Long, ByVal sPath As String, ByVal sValue As String, ByVal sData As String, ByVal sApp As Variant, ByVal sIniFile As Variant) ‘向注册表写入数据, 如果失败则向初始化文件写入
On Error Resume Next
Dim lResult1, lResult2
‘Create a new key
lResult1 = RegCreateKey(hkey, sPath, lRet)
‘Save a string to the key
lResult2 = RegSetValueEx(lRet, sValue, 0, REG_SZ, ByVal sData, Len(sData))
‘close the key
RegCloseKey lRet
On Error GoTo 0
‘Debug.Print lResult1
‘Debug.Print lResult2
‘OS is diversity, determine if registry success
If IsMissing(sApp) Then Exit Function
If IsMissing(sIniFile) Then Exit Function
If lResult1 = 0 And lResult2 = 0 And Not ChineseExist(sData) Then Exit Sub ‘含汉字字符串时结果有问题
On Error Resume Next
‘Write ini file, when operating Registry is fail.
WriteIniFile sApp, sValue, sData, sIniFile
WritePrivateProfileString sApp, sValue, sData, sIniFile
On Error GoTo 0
End Sub

Sub DelSetting(ByVal hkey As Long, ByVal sPath As String, ByVal sValue As String, ByVal sApp As Variant, ByVal sIniFile As Variant) ‘删除注册表数据, 如果失败则删除初始化文件数据
On Error Resume Next
‘Debug.Print hKey
‘Debug.Print sPath
‘Debug.Print sValue
Dim lResult1, lResult2
‘Create a new key
lResult1 = RegCreateKey(hkey, sPath, lRet)
‘Delete the key’s value
lResult2 = RegDeleteValue(lRet, sValue)
‘close the key
RegCloseKey lRet
On Error GoTo 0
‘Debug.Print lResult1
‘Debug.Print lResult2
‘OS is diversity, determine if registry success
If IsMissing(sApp) Then Exit Function
If IsMissing(sIniFile) Then Exit Function
If lResult1 = 0 And hkey = HKEY_LOCAL_MACHINE Then Exit Sub ‘lResult2 = 2 or 5 含汉字字符串时须两处删除
On Error Resume Next
‘Write ini file, when operating Registry is fail.
WriteIniFile sApp, sValue, vbNullString, sIniFile
WritePrivateProfileString sApp, sValue, vbNullString, sIniFile
On Error GoTo 0
End Sub

Public Sub DelKey(hkey As Long, sKey As String)
‘Delete the key
lRet = RegDeleteKey(hkey, sKey)
End Sub

正则表达式(Regular Express)函数系列之一

Public Function ChineseExist(sText) As Boolean ‘有无汉字
Dim oRegExp As Object
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Pattern = “[\u4e00-\u9fa5]”
oRegExp.Global = True
ChineseExist = oRegExp.Test(sText)
Set oRegExp = Nothing
End Function

Public Function NumberSeries(ByVal sText As String) As Variant ‘提取文字中的纯数字,以数组的形式返回
Dim oRegExp As Object
Dim oMatches As Object ‘匹配字符串集合对象
Dim oMatch As Object ‘匹配字符串
Set oRegExp = CreateObject(“Vbscript.RegExp”)
Dim iCount As Integer
Dim TempArray() As Double
With oRegExp
.Global = True ‘True表示匹配所有, False表示仅匹配第一个符合项
.IgnoreCase = True ‘True表示不区分大小写, False表示区分大小写
.Pattern = “([0-9])?.+|([0-9])+” ‘匹配字符模式(不识 + – % 号)
Set oMatches = .Execute(sText) ‘执行正则查找,返回所有匹配结果的集合,若未找到,则为空
For Each oMatch In oMatches
ReDim Preserve TempArray(0 To iCount)
TempArray(iCount) = oMatch.Value
iCount = iCount + 1
Next
End With
NumberSeries = TempArray
Set oRegExp = Nothing
Set oMatches = Nothing
End Function

Public Function PureLetter(sText) As Boolean ‘纯字母
Dim oRegExp As Object
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Pattern = “^[A-Za-z]+$”
oRegExp.Global = True
PureLetter = oRegExp.Test(sText)
Set oRegExp = Nothing
End Function

Public Function PureNumber(sText) As Boolean ‘纯数字
Dim oRegExp As Object
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Pattern = “^[0-9]+$”
oRegExp.Global = True
PureNumber = oRegExp.Test(sText)
Set oRegExp = Nothing
End Function

Public Function ReplaceExp(ByVal sText As String, ByVal sPattern As String, ByVal sNew As String) As String ‘文字替换
Dim oRegExp As Object
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Pattern = sPattern ‘设置模板属性
oRegExp.IgnoreCase = True ‘忽略大小写
oRegExp.Global = True ‘匹配所有搜索项还是只匹配第一项
oRegExp.MultiLine = True ‘是否在多行中搜索
ReplaceExp = oRegExp.Replace(sText, sNew)
Set oRegExp = Nothing
End Function

Public Function IsUrl(ByVal sText As String) As Boolean ‘合法 Url
On Error GoTo ERR_Url
Dim oRegExp As Object
IsUrl = False
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Pattern = “(((ht|f)tps?://)|(www.))([\w-]+.)+[\w-:]+(/[\w- ./?%#;&=]*)?”
oRegExp.Global = True
IsUrl = oRegExp.Test(sText)
Set oRegExp = Nothing
ERR_Url:
End Function

Public Function IsMail(ByVal sText As String) ‘合法 eMail
On Error GoTo ERR_Mail
Dim oRegExp As Object
IsMail = False
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Pattern = “\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*”
oRegExp.Global = True
IsMail = oRegExp.Test(sText)
Set oRegExp = Nothing
ERR_Mail:
End Function

Public Function ChineseCount(ByVal sText As String) As Long ‘汉字数量
Dim oRegExp As Object
Dim oMatchs As Object
Set oRegExp = CreateObject(“VBScript.RegExp”)
oRegExp.Global = True
oRegExp.Pattern = “[\u4e00-\u9fa5]”
Set oMatchs = oRegExp.Execute(sText) ‘成功匹配的 Match 对象集合
ChineseCount = oMatchs.Count
Set oRegExp = Nothing
End Function

Public Function CheckID(ByVal sText As String, ByVal iFunction As Integer) As String ‘核查 ID, 判断证件号码是否正确, 或提取出生日期,或返回性别, 或返回年龄
Dim oItem As Object
Dim iSum As Integer
Dim FactorArray As Variant, CRCArray As Variant
Dim I As Integer
Dim sBirthDate As String
FactorArray = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) ‘身份证号加权因子
CRCArray = Array(“1”, “0”, “X”, “9”, “8”, “7”, “6”, “5”, “4”, “3”, “2”) ‘最后一位有效校验位
If Len(sText) = 18 Then ‘判断是否为18位
Set oRegExp = CreateObject(“Vbscript.RegExp”)
oRegExp.Pattern = “[A-Za-z0-9]{1}” ‘应用正则表达式分拆成18个1位数,此步可以应用mid函数,但正则表达式会效率会更高
oRegExp.Global = True
Set oItem = oRegExp.Execute(sText)
For I = 0 To 16
iSum = oItem(I) * FactorArray(I) + iSum
Next I
If CRCArray(iSum Mod 11) = UCase(oItem(17)) Then
Select Case iFunction
Case 1 ‘判断证件号码是否正确
CheckID = “True”
Case 2 ‘提取出生日期
CheckID = Format(Mid(sText, 7, 8), “0-00-00”)
Case 3 ‘返回性别
If oItem(16) Mod 2 = 0 Then CheckID = “Female” Else CheckID = “Male”
Case 4 ‘返回周岁年龄
sBirthDate = Format(Mid(sText, 7, 8), “0-00-00”)
If Month(sBirthDate) < Month(Date) Then CheckID = DateDiff(“yyyy”, sBirthDate, Date) ElseIf Month(sBirthDate) > Month(Date) Then
CheckID = DateDiff(“yyyy”, sBirthDate, Date) – 1
ElseIf Day(sBirthDate) > Day(Date) Then
CheckID = DateDiff(“yyyy”, sBirthDate, Date) – 1
Else
CheckID = DateDiff(“yyyy”, sBirthDate, Date)
End If
End Select
Else
CheckID = “False” ‘错误
End If
Else
CheckID = “Invalid” ‘非中国居民身份证
End If
End Function