Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
member007
Зарегистрирован: 24.02.2008 Сообщения: 20 Откуда: Москва
|
Добавлено: Сб Май 02 2009 07:43 Заголовок сообщения: GetPrivateProfileString: чтение списка (VBA) |
|
|
Есть известная API-функция GetPrivateProfileString для чтения ini-файлов:
Код: |
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: ...If this parameter is NULL, the GetPrivateProfileString function copies all section names in the file to the supplied buffer.
lpKeyName: ...If this parameter is NULL, all key names in the section specified by the lpAppName parameter are copied to the buffer specified by the lpReturnedString parameter. |
Попробуем (для начала) считать из ini-файла все секции процедурой из Access-модуля.
Код: | Private Sub GPPStest()
Const messTit$ = "Test for GetPrivateProfileString"
Const nBufL& = 200
Dim nRet&, sBuff$
Dim sCPath$
sCPath = CurrentProject.Path
sBuff = String(nBufL, vbNullChar)
nRet = GetPrivateProfileString(Null, Null, "", sBuff, nBufL, sCPath & "\test.ini")
If nRet = 0 Then MsgBox "Error!", vbCritical, messTit Else MsgBox "OK!", vbInformation, messTit
End Sub |
Увы, на 2-й параметр ругается ещё компиляция:
Если же вместо него подставить, скажем, пустую строку:
Код: | nRet = GetPrivateProfileString(Null, "", "", sBuff, nBufL, sCPath & "\test.ini") |
то при выполнении выскакивает ошибка № 94:
Код: | Invalide use of Null |
(ругается, надо понимать, уже на 1-й параметр).
Так как с помощью GetPrivateProfileString считать список секций? А потом список ключей в секции?
(На всякий случай: длина обрабатываемого ini-файла много, много меньше 64 K.) |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Вт Май 05 2009 15:37 Заголовок сообщения: Титаренко Ромео: это ты хорошо придумал. главное -- вовремя! |
|
|
смотрим на мсдн'е объявление функции GetPrivateProfileString:DWORD WINAPI GetPrivateProfileString(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in LPCTSTR lpDefault,
__out LPTSTR lpReturnedString,
__in DWORD nSize,
__in LPCTSTR lpFileName
); как видим, первые два параметра -- это указатели, говоря по-асмовски, это адреса.
теперь смотрим, что товарищ член007 хочет передать в эту функцию: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 видим, что передаются не адреса, а чёрт-те что: в первом случае:nRet = GetPrivateProfileString(Null, Null, "", sBuff, nBufL, sCPath & "\test.ini") второй параметр компилятор аксесса хочет отдать как нетипизированый параметр, то есть с информацией о типе, а сама функция такой дряни -- понимаешь -- не понимает, так как хочет простой советский асмовский адрес. и он, компилятор, естественно, даёт отлуп по несоответствию типов. во втором случае:nRet = GetPrivateProfileString(Null, "", "", sBuff, nBufL, sCPath & "\test.ini") всё понимается как надо, но только в функцию-то передали не готовую переменную со значением Null, а то, что наделал компилятор аксесса под этот самый Null, когда передавал его вместо строки. и когда с этим г... начинает работать сама библиотечная фукнция, её начинает тошнить (функция -- напомню -- просит простой советский адрес)
вывод:
вар. 1. попробовать в обоих параметров установить тип string и передавать пустую строку, а не null (её аксесс сам превратит в сишный null)
вар. 2. передавать переменные таким образом: перед вызовом функции вычислять адреса передаваемых переменных и передавать их в виде строки в машинных символах
вар. 3. попробовать нормальную советскую передачу параметров по ссылке (вроде бы подключаемые функции такое позволяют)
-------------------------------------
Титаренко Ромео: это ты хорошо придумал. главное -- вовремя! |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Вт Май 05 2009 16:19 Заголовок сообщения: писали на си/паскале, но пришёл злой микрософт и придумал VB |
|
|
вот, кстати, пример из мсдн'а с решением по вар. 1: Код: | Imports System.Runtime.InteropServices
Imports System.Text
Module1
Private Declare Auto Function GetPrivateProfileString Lib "kernel32" (ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As StringBuilder, _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer
Sub Main()
Dim res As Integer
Dim sb As StringBuilder
sb = New StringBuilder(500)
res = GetPrivateProfileString("AppName", "KeyName", "", sb, sb.Capacity, "c:\test.ini")
Console.WriteLine("GetPrivateProfileStirng returned : " & res.ToString())
Console.WriteLine("KeyName is : " & sb.ToString())
End Sub
End Module |
---------------------
жили-были программисты, писали себе на си и паскале, не тужили. но потом пришёл злой микрософт и придумал VB |
|
Вернуться к началу |
|
|
member007
Зарегистрирован: 24.02.2008 Сообщения: 20 Откуда: Москва
|
Добавлено: Пт Июл 17 2009 19:23 Заголовок сообщения: Re: писали на си/паскале, но пришёл злой микрософт и придумал VB |
|
|
Спасибо за длинные разъяснения, не имеющие отношения к теме.
Получить значение ключа в секции можно безо всяких форумов.
Я спрашивал: как получить список ключей (секций)?
Т.е. запрос типа
GetPrivateProfileString(vSect, "" , "", sBuff, nBufL, sCPath & nFile)
или
GetPrivateProfileString("", "" , "", sBuff, nBufL, sCPath & nFile) |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Ср Июл 29 2009 15:56 Заголовок сообщения: справились программисты с VB, тогда микрософт придумал VBS |
|
|
member007 писал(а): | Я спрашивал: как получить список ключей (секций)?
Т.е. запрос типа
GetPrivateProfileString(vSect, "" , "", sBuff, nBufL, sCPath & nFile)
или
GetPrivateProfileString("", "" , "", sBuff, nBufL, sCPath & nFile) | а письмо от Вт Май 05 2009 17:19 не является ответом?
----------------------------------------------------------------------------
справились программисты с VB, тогда злой микрософт придумал VBS |
|
Вернуться к началу |
|
|
member007
Зарегистрирован: 24.02.2008 Сообщения: 20 Откуда: Москва
|
Добавлено: Ср Окт 14 2009 22:25 Заголовок сообщения: Re: справились программисты с VB, тогда микрософт придумал VBS |
|
|
а письмо от Вт Май 05 2009 17:19 не является ответом?
----------------------------------------------------------------------------
справились программисты с VB, тогда злой микрософт придумал VBS[/quote]
Нет не является: Вы мне старательно объясняете, как чайнику, как найти значение данного ключа в данной секции (примеры на это везде есть), а я спрашиваю, как построить список - ключей в секции или секций. |
|
Вернуться к началу |
|
|
|