' mLIni Ini file operation through WinAPI calls ' Written Apr'97 by Emil Sildos ' ' Работа с ini-файлами. Помимо хуков функций WinAPI реализован интерфейс ' LIni / LIniSet / LIniCollect / LIniChild / LIniParent ' ' LIni = GetPrivateProfileString ' LIniSet = WritePrivateProfileString ' LIniCollect если ключ не найден, ищет в секции, ссылка на которую лежит в ' ключе, имя которого является аргументом. И т.д. по цепочке ' LIniChild = LIniCollect, ссылка на секцию в ключе 'LIniChild' ' LIniParent = LIniCollect, ссылка на секцию в ключе 'LIniParent' 'Option Compare Database 'Use database order for string comparisons Option Explicit Declare Function LGetPrivateProfileString16 Lib "KERNEL" Alias "GetPrivateProfileString" (ByVal lpSection As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer Declare Function LGetPrivateProfileString32 Lib "KERNEL32" Alias "GetPrivateProfileStringA" (ByVal lpSection As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer Declare Function LWritePrivateProfileString16 Lib "KERNEL" Alias "WritePrivateProfileString" (ByVal lpszSection As String, ByVal lpszEntry As String, ByVal lpszString As String, ByVal lpszFilename As String) As Integer ' Можно использовать в качестве уникального lpDefault для GetPrivate... Global Const LcIniDefault = "Pqyss7mufpSifBKgymJe" ' LIniCollect устанавливает в эту переменную имя секции, из которой в конце концов ' взяла (пыталась взять) значение ключа Global LvIniCollectSection As String Function LGetPrivateProfileString(ByVal lpSection As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpFileName As String) As String Dim lpReturnedString As String Dim gotBytes As Integer lpReturnedString = String(1024, "*") gotBytes = LGetPrivateProfileString16(lpSection, lpKeyName, lpDefault, lpReturnedString, Len(lpReturnedString), lpFileName) LGetPrivateProfileString = left(lpReturnedString, gotBytes) End Function Function LIni(ByVal lpSection As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpFileName As String) As String LIni = LGetPrivateProfileString(lpSection, lpKeyName, lpDefault, lpFileName) End Function Function LIniChild(lpSection, lpKeyName, lpDefault, lpFileName) As String LIniChild = LIniCollect("LIniChild", lpSection, lpKeyName, lpDefault, lpFileName) End Function ' Проходит по цепочке секций Ini-файла в поисках ключа, возвращает значение первого найденного ' Устанавливает глобальную переменную LvIniCollectSection ' ' lpNextSection - имя ключа, в котором лежит имя следующей секции цепочки ' Function LIniCollect(ByVal lpNextSection As String, ByVal lpSection As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpFileName As String) As String LvIniCollectSection = lpSection Do If LIni(LvIniCollectSection, lpKeyName, LcIniDefault, lpFileName) <> LcIniDefault Then ' Ключ найден в какой-то из секций LIniCollect = LIni(LvIniCollectSection, lpKeyName, lpDefault, lpFileName) Exit Function End If LvIniCollectSection = LIni(LvIniCollectSection, lpNextSection, LcIniDefault, lpFileName) Loop While LvIniCollectSection <> LcIniDefault ' Ключ не нашелся нигде, попробуем напоследок стартовую секцию еще раз LvIniCollectSection = lpSection LIniCollect = LIni(LvIniCollectSection, lpKeyName, lpDefault, lpFileName) End Function Function LIniParent(lpSection, lpKeyName, lpDefault, lpFileName) As String LIniParent = LIniCollect("LIniParent", lpSection, lpKeyName, lpDefault, lpFileName) End Function Function LIniSet(ByVal lpszSection As String, ByVal lpszEntry As String, ByVal lpszString As String, ByVal lpszFilename As String) As Integer LIniSet = LWritePrivateProfileString(lpszSection, lpszEntry, lpszString, lpszFilename) End Function Function LWritePrivateProfileString(ByVal lpszSection As String, ByVal lpszEntry As String, ByVal lpszString As String, ByVal lpszFilename As String) As Integer LWritePrivateProfileString = LWritePrivateProfileString16(lpszSection, lpszEntry, lpszString, lpszFilename) End Function