powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Получить список ключей (key) в секции ini файла
11 сообщений из 11, страница 1 из 1
Получить список ключей (key) в секции ini файла
    #36536465
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Необходимо получить список ключей(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
Получить список ключей (key) в секции ini файла
    #36536467
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используемый ini
...
Рейтинг: 0 / 0
Получить список ключей (key) в секции ini файла
    #36536583
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тебе нужна ф-ция

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

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

дальше дело техники распарсить их по переводу каретки и знаку равно.
...
Рейтинг: 0 / 0
Получить список ключей (key) в секции ini файла
    #36536717
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
Получить список ключей (key) в секции ini файла
    #36536928
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё равно возвращает только первый ключ со значением.
Даже если использовать GetPrivateProfileSectionNames , которая должна вернуть список всех секций - возвращает только первую.
Не пойму в чём дело.
Такое ощещение что что-то с переводом коретки.
...
Рейтинг: 0 / 0
Получить список ключей (key) в секции ini файла
    #36537076
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а... совсем забыл.
возвращются строки разделенные нулевым символом (не переводом каретки)
последняя строка заканчивается двумя нулевыми символами...
т.е. вместо ref string надо ref blob со всеми вытекающими последствиями...
...
Рейтинг: 0 / 0
Получить список ключей (key) в секции ini файла
    #36537488
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry..,

Спасибо, разобрался - всё получилось.
...
Рейтинг: 0 / 0
Получить список ключей (key) в секции ini файла
    #36537631
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Получить список ключей (key) в секции ini файла
    #36537711
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, для всех стринг (или блоб) переменных в которую внешняя длл должна что-то записать
...
Рейтинг: 0 / 0
Получить список ключей (key) в секции ini файла
    #36543118
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к баранам, сегодня на Сайбесовских группах было предложено следующее:
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
Получить список ключей (key) в секции ini файла
    #36543792
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну тогда уж в копилку:

Код: 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
11 сообщений из 11, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Получить список ключей (key) в секции ini файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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