Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Получить список ключей (key) в секции ini файла / 11 сообщений из 11, страница 1 из 1
23.03.2010, 11:55
    #36536465
umalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
Добрый день!
Необходимо получить список ключей(key) в конкретной секции ini файла.

Нашёл api-шную функцию GetPrivateProfileString

Объявление:
FUNCTION Ulong GetPrivateProfileString( REF string lpAppName, REF string lpKeyName, REF string lpDefault, REF string lpReturnedString, Ulong nSize, REF string lpFileName ) &
LIBRARY "kernel32.dll" alias for "GetPrivateProfileStringA;Ansi"

Вызов:
Ulong ll_fs, d_size
String lpAppName, lpKeyName, lpDefault, lpReturnedString, lpFileName

lpAppName = 'SHEETS'
SetNull(lpKeyName)
lpDefault = ''
lpFileName = 'C:\Work_v11\session_control\admsb.ini'
d_size = 500
//

ll_fs = GetPrivateProfileString( lpAppName, lpKeyName, lpDefault, lpReturnedString, 500, lpFileName );
//
Возвращает имя только первого ключа.
Что не так делаю?

PowerBuilder 11.1 Build 8226
...
Рейтинг: 0 / 0
23.03.2010, 11:56
    #36536467
umalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
используемый ini
...
Рейтинг: 0 / 0
23.03.2010, 12:26
    #36536583
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
тебе нужна ф-ция

Код: plaintext
1.
2.
3.
4.
5.
6.
DWORD WINAPI GetPrivateProfileSection(
  __in   LPCTSTR lpAppName,
  __out  LPTSTR lpReturnedString,
  __in   DWORD nSize,
  __in   LPCTSTR lpFileName
);

она возвращает все строки указанной секции
правда со значениями

дальше дело техники распарсить их по переводу каретки и знаку равно.
...
Рейтинг: 0 / 0
23.03.2010, 13:00
    #36536717
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
и по поводу вызова:

любые ref string надо инициализировать в билдере перед вызовом
иначе будет крах

т.е. примерно вызов такой:


Код: plaintext
1.
2.
3.
4.
5.
long iData= 1024  //максимальное кол-во символов которое мы прочитаем
string sData
sData=space(iData)

GetPrivateProfileSection("MySectionName", sData, iData, sFilename)

и еще, используйте GetPrivateProfileSectionW а не GetPrivateProfileSectionA
...
Рейтинг: 0 / 0
23.03.2010, 13:55
    #36536928
umalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
Всё равно возвращает только первый ключ со значением.
Даже если использовать GetPrivateProfileSectionNames , которая должна вернуть список всех секций - возвращает только первую.
Не пойму в чём дело.
Такое ощещение что что-то с переводом коретки.
...
Рейтинг: 0 / 0
23.03.2010, 14:30
    #36537076
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
а... совсем забыл.
возвращются строки разделенные нулевым символом (не переводом каретки)
последняя строка заканчивается двумя нулевыми символами...
т.е. вместо ref string надо ref blob со всеми вытекающими последствиями...
...
Рейтинг: 0 / 0
23.03.2010, 16:11
    #36537488
umalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
Dmitry..,

Спасибо, разобрался - всё получилось.
...
Рейтинг: 0 / 0
23.03.2010, 16:45
    #36537631
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
Dmitry..и по поводу вызова:

любые ref string надо инициализировать в билдере перед вызовом
иначе будет крах

т.е. примерно вызов такой:


Код: plaintext
1.
2.
3.
4.
5.
long iData= 1024  //максимальное кол-во символов которое мы прочитаем
string sData
sData=space(iData)

GetPrivateProfileSection("MySectionName", sData, iData, sFilename)

и еще, используйте GetPrivateProfileSectionW а не GetPrivateProfileSectionA
Это что действительно надо делать во всех версиях РВ или только в этом частном случае?
...
Рейтинг: 0 / 0
23.03.2010, 17:07
    #36537711
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
да, для всех стринг (или блоб) переменных в которую внешняя длл должна что-то записать
...
Рейтинг: 0 / 0
25.03.2010, 18:34
    #36543118
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
Возвращаясь к баранам, сегодня на Сайбесовских группах было предложено следующее:
One alternative approach for parsing the series of null-separated (00 00)
pairs is instead of blob to use BYTE and BYTE ARRAY variables in either of
the following 3 ways:

1) by modifying the parameter of the external function like this:
Код: plaintext
1.
Function long GetPrivateProfileSection(String sectionName, REF Byte returnedString[], long bufferSize, String fileName) Library "kernel32.dll" alias for "GetPrivateProfileSectionW"

And then call it and customize the replacement:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Byte b[]
b[ 20000 ] =  0   // reserve memory
long i, len
len = GetPrivateProfileSection(asSection, b,  10000  /* # of chars, not bytes */, is_ini_filename)
len *=  2  // adjust for  16 -bit encoding
// Convert null bytes to newlines (otherwise string conversion stops after first null byte!)
for i =  1  to len -  1  Step  2 
    if b[i] =  0  and b[i+ 1 ] =  0  then b[i] =  10   // asc("~n") =  10 
next

return String(Blob(b))

2) after the external call convert your blob to a byte array for processing convenience:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Blob{ 20000 } b /* Will hold 10K Unicode chars, my guess at max section size */
long i, len
len = GetPrivateProfileSection(asSection, b,  10000  /* # of chars, not bytes */, is_ini_filename)
len *=  2  // adjust for  16 -bit encoding
// Convert null bytes to newlines (otherwise string conversion stops after first null byte!)
Byte bt[]
bt = GetByteArray(b)
for i =  1  to len -  1  Step  2 
    if bt[i] =  0  and bt[i+ 1 ] =  0  then bt[i] =  10   // asc("~n") =  10 
next

return String(Blob(bt))

3) at last, you have the functions GetByte and SetByte which manipulate blobs at a byte-level, thus eliminating the need to use such String(BlobMid... or BlobEdit(..., EncodingAnsi!) constructs:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Blob{ 20000 } b /* Will hold 10K Unicode chars, my guess at max section size */
long i, len
len = GetPrivateProfileSection(asSection, b,  10000  /* # of chars, not bytes */, is_ini_filename)
len *=  2  // adjust for  16 -bit encoding
// Convert null bytes to newlines (otherwise string conversion stops after first null byte!)
Byte bt1, bt2
for i =  1  to len -  1  Step  2 
   GetByte(b, i, bt1)
   GetByte(b, i+ 1 , bt2)
   if bt1 =  0  and bt2 =  0  then SetByte(b, i,  10 )  // asc("~n") =  10 
next

return String(b)
...
Рейтинг: 0 / 0
26.03.2010, 09:53
    #36543792
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить список ключей (key) в секции ini файла
ну тогда уж в копилку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	
	blob b  /*здесь блоб с юникодовой строкой разделенной нулевым символом*/
	string s  /*временная строка*/
	string lines[]   /*результирующий массив*/
	long index= 0   
	
	do
		s=string(b)
		if s='' then exit 
		index++
		lines[index]=s
		b=blobmid(b, (len(s)+ 1 )* 2 + 1 )
	loop while true
	
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Получить список ключей (key) в секции ini файла / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]