Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Null символ как побороть (число прочтений - 5027 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Null символ как побороть
18. Мая 2012 :: 12:04
Печать  
Разбираюсь со скриптом для чтения INI файлов (скрипт на vbs). Использую WinAPI функцию GetPrivateProfileSection (см. здесь http://msdn.microsoft.com/en-us/library/windows/desktop/ms724348%28v=vs.85%29.as...). Функция возвращает все строки "Ключ=Значение" для заданной секции. Но эти строки разделены Null символом. В 1С доходит только первая строка.

Вопрос - Можно ли как-то заменить этот символ Null в самом скрипте на что-то другое? Чтобы потом уже парсить переданную строку в самой 1С?

Вот пример выдранного куска из моего скрипта:

Код
Выбрать все
Wrap.Register ""kernel32"", ""GetPrivateProfileSection"", ""i=sSls"", ""r=l""
  |
  | Public Function INIGetS(SecName,IniFile)
  |  Ret = 0
  |  BufLen = 1024
  |  sBuf = Space(BufLen)
  |  Ret   = Wrap.GetPrivateProfileSection(SecName,sBuf,BufLen,IniFile)
  |  INIGetS = Join(Split(Left(sBuf, Ret), vbNullChar)) 'Len(sBuf)
  | End Function 



По идее, передав в функцию INIGetS имя секции и имя ini-файла я должен получить строку из всех "Параметр=Значение" разделенных vbNullChar. Значение Ret показывает вроде правильную длину строки, но сама строка sBuf содержит почему-то только первую пару Пар=Знач. И Len(sBuf) тоже возвращает длину этой первой пары.... В общем странные вещи... Может сам Wrap неправильно как-то строку возвращает?
« Последняя редакция: 18. Мая 2012 :: 14:49 - alyuev »  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Null символ как побороть
Ответ #1 - 22. Мая 2012 :: 06:48
Печать  
еще актуально?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Null символ как побороть
Ответ #2 - 22. Мая 2012 :: 08:26
Печать  
ага
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Null символ как побороть
Ответ #3 - 22. Мая 2012 :: 09:37
Печать  
попробуй этот вариант

Код
Выбрать все
	|Public Wrap
	|Set Wrap = CreateObject(""DynamicWrapperX"")
	|Wrap.Register ""kernel32"", ""GetPrivateProfileSection"", ""i=spls"", ""r=l""
	|
	|Public Function INIGetS(SecName,IniFile)
	|	Ret 	= 0
	|	BufLen 	= 1024
	|	str 	= Wrap.Space(BufLen)
	|	sBuf 	= Wrap.StrPtr(str)
	|	Ret 	  = Wrap.GetPrivateProfileSection(SecName, sBuf, BufLen, IniFile)
	|	INIGetS = Wrap.StrGet(sBuf + s, ""s"")
	|	p 		= Len(INIGetS) + 1
	|	Do While Ret > p
	|		curStr	= Wrap.StrGet(sBuf + p, ""s"")
	|		p 		= p + Len(curStr) + 1
	|		INIGetS = INIGetS & vbCrLf & curStr
	|	Loop
	|End Function
 

  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Null символ как побороть
Ответ #4 - 23. Мая 2012 :: 08:51
Печать  
Ой, спасибо большое, chessman!!!

Да.... я б не додумался до такого.... Наверное поэтому и реализовали эти функции StrPtr и StrGet, что есть проблемы со считыванием строк, я правильно понимаю?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Null символ как побороть
Ответ #5 - 23. Мая 2012 :: 10:24
Печать  
На мой взгляд, эти ф-и предоставляют удобный серсис работы со строками на уровне адресов памяти.
Реально, в твоем случае, строки были разделены '0', поэтому в коде я через этот ноль "переступаю":
Код
Выбрать все
p = p + Len(curStr) + 1 



ЗЫ: я перед написанием кода, глянул ИДой, что прилетает после вызова GetPrivateProfileSection.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Null символ как побороть
Ответ #6 - 23. Мая 2012 :: 14:08
Печать  
Да, в МСДН сказано, что разделитель строк null-символ, т.е. символ с кодом = 0.

У меня ещё один вопрос появился - а как передать значение Null? У меня это тоже не получилось В частности для функции WritePrivateProfileString если передать строку (значение ключа) = Null - удаляется значение ключа и сам ключ. При передаче параметра Null скрипт ругается на несоответствие типа.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Null символ как побороть
Ответ #7 - 23. Мая 2012 :: 17:13
Печать  
А какой параметр ты хочешь передать, как Null?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Null символ как побороть
Ответ #8 - 24. Мая 2012 :: 09:35
Печать  
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Null символ как побороть
Ответ #9 - 24. Мая 2012 :: 11:09
Печать  
В данном случае это просто число 0. Но, при регистрации функции в DWX, этот параметр должен иметь числовой тип. Соответственно, если ты хочешь туда передавать и строки и числа, то перед передачей строки, нужно получить указатель на нее (StrPtr).
Либо, можно просто создать 2 объекта DWX, в одном зарегить ф-ю с параметром "s", в другом, например "l" или "р". И вызывать соответствующую, в зависимости от того, что передаешь - строку или Null.
1-й вариант наверное оптимальнее.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Null символ как побороть
Ответ #10 - 24. Мая 2012 :: 11:31
Печать  
Для первого варианта: указатель-то получить можно, а что дальше - NumPut(0,Указатель)?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Null символ как побороть
Ответ #11 - 24. Мая 2012 :: 11:40
Печать  
Вообще - этот вопрос - передача Null для строкового параметра - это уже как спортивный интерес.
Потому что я для своего ИНИ файла сделал просто перезапись целиком. Т.е. при открытии файла формирую ТЗ и потом значения из этой ТЗ целиком пишу обратно в файл. Поэтому вопрос с удалением параметра через передачу Null отпал.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Null символ как побороть
Ответ #12 - 24. Мая 2012 :: 12:18
Печать  
alyuev писал(а) 24. Мая 2012 :: 11:31:
Для первого варианта: указатель-то получить можно, а что дальше - NumPut(0,Указатель)?


Тут просто 0, без NumPut, т.е. нулевой указатель.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать