Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

GetPrivateProfileString: чтение списка (VBA)

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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-й параметр ругается ещё компиляция:
Код:
Type mismatch
Surprised
Если же вместо него подставить, скажем, пустую строку:
Код:
 nRet = GetPrivateProfileString(Null, "", "", sBuff, nBufL, sCPath & "\test.ini")

то при выполнении выскакивает ошибка № 94:
Код:
Invalide use of Null

(ругается, надо понимать, уже на 1-й параметр). Sad

Так как с помощью GetPrivateProfileString считать список секций? А потом список ключей в секции?
(На всякий случай: длина обрабатываемого ini-файла много, много меньше 64 K.) Laughing
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
критикан



Зарегистрирован: 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 Ответить с цитатой

критикан писал(а):
вот, кстати, пример из мсдн'а с решением по вар. 1...


Спасибо за длинные разъяснения, не имеющие отношения к теме.
Получить значение ключа в секции можно безо всяких форумов.
Я спрашивал: как получить список ключей (секций)?
Т.е. запрос типа
GetPrivateProfileString(vSect, "" , "", sBuff, nBufL, sCPath & nFile)
или
GetPrivateProfileString("", "" , "", sBuff, nBufL, sCPath & nFile)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
критикан



Зарегистрирован: 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]
Нет не является: Вы мне старательно объясняете, как чайнику, как найти значение данного ключа в данной секции (примеры на это везде есть), а я спрашиваю, как построить список - ключей в секции или секций.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...