Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как пользоваться .ini файлами?


Автор: cardinal 29.12.2004, 20:51
 В MSDN написано, что функции для работы с ini-файлами оставлены лишь для совместимости с 16-битными версиями Windows, а приложения должны сохранять свои настройки в реестре. smile=29 

ini-файл - текстовый файл с данными в формате:

[секция]
Параметр=значение
...
[секция]
Параметр=значение
...

Для работы с ini-файлами используются API-функции:
WritePrivateProfileSection запись в ini-файл секции с параметрами
WritePrivateProfileString запись в ini-файл строкового параметра
GetPrivateProfileSection получение секции с параметрами
GetPrivateProfileSectionNames получение списка секций
GetPrivateProfileString получение строкового параметра

А вот так выглыдит их описание в VB (можно прямо так вставить в модуль):
Код
Private Declare Function api_GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" ( _
ByVal lpSectionName As String, _ 'Имя секции
ByVal lpReturnedString As String, _ 'Возвращаемое значение
ByVal nSize As Long, _ 'Максимальный размер возвращаемого значения
ByVal lpFileName As String _ 'путь к ini-файлу
) As Long

Private Declare Function api_GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpSectionName As String, _ 'Имя секции
ByVal lpKeyName As String, _ 'Имя параметра
ByVal lpDefault As String, _ 'Значение параметра по умолчанию
ByVal lpReturnedString As String, _ 'Возвращаемое значение
ByVal nSize As Long, _ 'Максимальный размер возвращаемого значения
ByVal lpFileName As String _ 'путь к ini-файлу
) As Long

Private Declare Function api_GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" ( _
ByVal lpReturnedString As String, _ 'Возвращаемое значение
ByVal nSize As Long, _ 'Максимальный размер возвращаемого значения
ByVal lpFileName As String _ 'путь к ini-файлу
) As Long

Private Declare Function api_WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" ( _
ByVal lpSectionName As String, _ 'Имя секции
ByVal lpString As String, _ 'Значение параметра
ByVal lpFileName As String _ 'путь к ini-файлу
) As Long

Private Declare Function api_WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
ByVal lpSectionName As String, _ 'Имя секции
ByVal lpKeyName As String, _ 'Имя параметра
ByVal lpString As String, _ 'Значение параметра
ByVal lpFileName As String _ 'путь к ini-файлу
) As Long

Теперь поподробнее о том, что с этим делать.
Попробуем что-нибудь сохранить. Для этого выполним следующее:
nRet = api_WritePrivateProfileString("MySection", "MyKey", "MyValue", App.Path & "\MyINI.ini")
Если nRet<>0, то произошла ошибка, описание которой можно посмотреть вызвав GetLastError(). Если же nRet=0, то смотрим, 
что получилось. В каталоге, где находится программа появился файл MyINI.ini.
Можно записать целую секцию:
Код
nRet = api_WritePrivateProfileSection("MySection2", "Key1=Value1" & vbNullChar & "Key2=Value2", App.Path & 
"\MyINI.ini")

Смотрим, что получилось.
Раз мы сохранили значения, значит надо их восстановить. С восстановлением немного сложнее. Напишем функцию:
Код
Public Function GetPrivateProfileString(SectionName As String, KeyName As String, Default As String, FileName As 
String) As String
Dim sBuf As String 'Здесь будет восстановленное значение
Dim nRet As Long 'Здесь будет значение, которое возвратит функция - длина 
'восстановленного значения
sBuf = String(1024, vbNullChar) 'Нужно занять место в памяти, а то будет ошибка
nRet = api_GetPrivateProfileString(SectionName, KeyName, Default, sBuf, 1024, FileName)
sBuf = Left(sBuf, nRet) 'Обрезаем лишнее
GetPrivateProfileString = sBuf
End Function

Также как и записать целую секцию можно восстановить целую секцию:
Код
Public Function GetPrivateProfileSection(SectionName As String, FileName As String) As String
Dim sBuf As String
Dim nRet As Long
sBuf = String(1024, vbNullChar)
nRet = api_GetPrivateProfileSection(SectionName, sBuf, 1024, FileName)
sBuf = Left(sBuf, nRet)
GetPrivateProfileSection = sBuf
End Function

Действия теже, только будет возвращена строка, содержащая параметры и значения в виде "Key=Value", разеленные пустыми 
символами (vbNullChar).
Можно получить список секций:
Код
Public Function GetPrivateProfileSectionNames(FileName As String) As String
Dim sBuf As String
Dim nRet As Long
sBuf = String(1024, vbNullChar)
nRet = api_GetPrivateProfileSectionNames(sBuf, 1024, FileName)
sBuf = Left(sBuf, nRet)
GetPrivateProfileSectionNames = sBuf
End Function

Этой функцией возвращается строка, содержащая имена секций, разделенные пустыми символами (vbNullChar).
Вот собственно все!:rolleyes 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)