|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
В общем есть параметр в реестре: ab (REG_SZ) Коварность в том что в нем может содержаться несколько значений через разделитель: aaa<>bbb<>ccc... В реестре WinXP разделитель отображается как квадратик (прямоугольничек), в Vista/Win7 вообще никак не отображается. Надо этот параметр "прочесть" и разбить на значения aaa,bbb,ccc и т.д. ================ Способ1: (1) С++ прога (не знаю как вытаскивает из реестра) сохраняет значение в файле: Код: plaintext 1.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
(4) ну и по символу <> расщепляю на aaa bbb и сcc Так вот, этим символом <> оказывается chr(13) ========== Данный способ по ряду причин не удобен и абсолютно непрофессионален, а самое плохое что C++ модуль включает тормоза (в силу его архитектурных особенностей, кот. объяснять долго и лишне) и на запуск формы с параметрами уходит много времени (несколько секунд на современном компе). Плюс мне известно где в реестре хранятся параметры, и я умею работать с ним напрямую (м.б. несколько миллисекунд на считывание реестра). Посему счас перехожу на "способ 2" =========================== Способ2: (1) Читаю параметр blablabla напрямую из реестра: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
(2) имею aaa<>bbb<>ccc (3) ну и по символу <> расщепляю на aaa bbb и сcc Так вот, этим символом <> оказывается chr(10) Т.е. один и тот же <> интерпретируется как chr(10) вместо chr(13). Мне не сложно заменить в последующем коде работы с параметрами chr(13) -> на chr(10) но меня это несколько смущает: вдруг где-то что-то не так сработает. Хочу получить комментарий/объяснение/успокоение почему так. ==== И еще сразу: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 19:23 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77Т.е. один и тот же <> интерпретируется как chr(10) вместо chr(13). Нет. В реестре - CHR(10). При записи в файл он заменяется на CHR(13). Дмитрий77Длина "blablabla" может быть много больше 255. Я смогу своей GetRegValue прочитать корректно длинный параметр?Нет. Следует зарезервировать минимум столько, сколько надо для помещения всего значения. Больше - можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 20:35 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77, авторДлина "blablabla" может быть много больше 255. Я смогу своей GetRegValue прочитать корректно длинный параметр? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 20:37 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
AkinaДмитрий77Т.е. один и тот же <> интерпретируется как chr(10) вместо chr(13). Нет. В реестре - CHR(10). При записи в файл он заменяется на CHR(13). Ладно, с этим успокоили. Заменяем в Split-коде chr(13) -> chr(10), более не заморачиваемся и не паримся. AkinaДмитрий77Длина "blablabla" может быть много больше 255. Я смогу своей GetRegValue прочитать корректно длинный параметр?Нет. Следует зарезервировать минимум столько, сколько надо для помещения всего значения. Больше - можно. Да, уже увидел. На тестовой строке в 1000 символов. У меня может быть разрешенная конструкция: a(1)<>a(2)<>a(3)...<>a(N) с неограниченным количеством слагаемых, длина каждого a(n) например по 100 символов. Если "Следует зарезервировать минимум столько, сколько надо", то надо писать Код: plaintext 1. 2.
Причем теоретически "может и перехлестнуть", архитектуру этих разделителей поменять не могу. Посему вариант: скукотища Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
мне нравится больше. Однако применив в лоб получил "ошибки памяти". Обсудим? Код: plaintext 1. 2.
Рабочим вариантом (вроде как) получился следующий: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Сойдет? Или что-то не так? (P.S. последний параметр ф-ции в обычном 100%-32битном случае всегда false, внимание обращать не надо; true - чтоб залезть в 64-битный реестр из нашего 32-битного приложения) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2011, 00:06 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77Условие ERROR_SUCCESS здесь (если с выделенным нулем) не срабатывает Из первоисточника : If lpData is NULL, and lpcbData is non-NULL, the function returns ERROR_SUCCESS and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This enables an application to determine the best way to allocate a buffer for the value's data. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2011, 08:22 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
скукотища Из первоисточника : If lpData is NULL, and lpcbData is non-NULL, the function returns ERROR_SUCCESS and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This enables an application to determine the best way to allocate a buffer for the value's data. Я охотно верю (и вижу ) что там так написано, но участок моего кода (+ добавленный debug) Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Код: plaintext 1.
lResult=234;lBuffSize=20 Const ERROR_MORE_DATA = 234& По утверждению что вы привели должен быть 0=error seccess либо сразу lResult=2;lBuffSize=0 (нету в реестре этого параметра) Как я уже сказал, с моим кодом (ф-ция целиком выше) жить вроде можно. А можно ли? Но все же, если не так то что делаю: м.б. 0 с амперсандом надо писать или с ByVal/ByRef где непонятки. Поправьте, что не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2011, 20:36 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77, не подскажите, хочу сделать это Закрыть средствами системного реестра возможность копирования информации с ПК на любой флеш-накопитель Есть скрипт? что-то вставляю в ВБА 5 констант: Const HKEY_CLASSES_ROOT = -2147483648 (&H80000000) Const HKEY_CURRENT_USER = -2147483647 (&H80000001) Const HKEY_LOCAL_MACHINE = -2147483646 (&H80000002) Const HKEY_PERFORMANCE_DATA = -2147483644 (&H80000004) Const HKEY_USERS = -2147483645 (&H80000003) все выделены красным цветом, что за ересь? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2011, 21:50 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2011, 21:53 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
понял, видимо так нужно: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2011, 21:58 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Ципихович Эндрю, Обычно пишут так Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2011, 05:06 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77Как я уже сказал, с моим кодом (ф-ция целиком выше) жить вроде можно. А можно ли? Но все же, если не так то что делаю: м.б. 0 с амперсандом надо писать или с ByVal/ByRef где непонятки. Поправьте, что не так. Вроде бы нашёл, "дэ собака порывся": RegQueryValueEx возвращает ERROR_MORE_DATA если lBuffSize меньше размера запрашиваемых данных, независимо от того, просим мы вернуть данные или нет ( передаем ссылку на szBuffer или Null ) Помогло такое: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
объявления функций Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2011, 17:10 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
скукотищаПомогло такое: Код: plaintext 1. 2.
скукотища, добавление lBuffSize = -1 действительно трансформирует ERROR_MORE_DATA в ERROR_SUCCESS но при запросе "-цать" параметров на каком-нибудь обязательно будет VB-crash и memory не может быть read. Почему не знаю. Декларации ф-ций у нас одинаковы. Ну, приведите ваш вариант Private Function GetRegValue целиком, я попробую посмотреть что будет при запросе моих "много параметров". За что собственно боремся? за ERROR_SUCCESS? Дмитрий77Ну т.е. Код: plaintext 1.
lResult=234;lBuffSize=20 Const ERROR_MORE_DATA = 234& А не наплевать ли нам на него? Нам ведь нужно lBuffSize=20 !!! Чем не нравится мой код, приведенный целиком выше? Ну да, есть издержка: lResult=2;lBuffSize=0 и все равно запускаю RegQueryValueEx второй раз, но издержка никогда не даст ERROR_SUCCESS на втором шаге (когда уже прошу реальное значение), так что ничем не рискую. Ну хорошо. Будем чуть более аккуратны: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Хотя вот честно от греха подальше оставил бы свой предыдущий вариант без проверки этого этапа, т.е. с издержками безусловным запуском Код: plaintext 1.
Что скажете? --- Еще кстати несколько смущает Код: plaintext
Во всяких документациях на эту тему не нашел ошибки за номером 2 !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2011, 23:37 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77, >но при запросе "-цать" параметров на каком-нибудь обязательно будет VB-crash и memory не может быть read. всего лишь предположение - VB пробует выполнять Ваш код в несколько потоков, хотя Вы об этом его не просите. Как пресечь - не знаю. >Ну, приведите ваш вариант... функцию не писал, обошелся "наколенной" процедурой с заданием параметров константами в последей Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90.
>За что собственно боремся? за ERROR_SUCCESS? Да, за него, родимого. Можно и наплевать. Необходимый размер буфера получили. Чего же боле?(с) >Еще кстати несколько смущает > lResult=2;lBuffSize=0 Ничего аномального: If the function fails, the return value is a system error code ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2011, 00:05 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
ЗЫ: >Еще кстати несколько смущает > lResult=2;lBuffSize=0 Наверное правильнее было бы интерпретировать этот ответ так: If the lpValueName registry value does not exist, the function returns ERROR_FILE_NOT_FOUND ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2011, 00:21 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
скукотищаДмитрий77, >но при запросе "-цать" параметров на каком-нибудь обязательно будет VB-crash и memory не может быть read. всего лишь предположение - VB пробует выполнять Ваш код в несколько потоков, хотя Вы об этом его не просите. Как пресечь - не знаю. >Ну, приведите ваш вариант... функцию не писал, обошелся "наколенной" процедурой с заданием параметров константами в последей Я вставил вашу Sub в тест-проект (в приложении). 1)Запустите в VB среде 2) Нажмите Command1 -в debug получите результат 3) Остановите проект. 4) Закройте проект (vb среду) На шаге (4) будет 1) vb-crash 2) возможно память не может быть read Думаю природа собаки таже. (с реальными параметрами у меня этот crash получается еще на этапе выполнения проги) скукотища>За что собственно боремся? за ERROR_SUCCESS? Да, за него, родимого. Можно и наплевать. Необходимый размер буфера получили. Чего же боле?(с) Вот я тоже думаю использовать свой код и не париться боле, ибо он не дает crash. Беспокоит одно: не гавкнет ли зарытая собака и с моим кодом тоже при каких-то обстоятельствах? Проблема возникает тогда, когда пытаетесь заранее инициализировать буфер (lDataLen =X особенно с -1), а потом его переигрываете через запрос с нулевым параметром. Если lDataLen не инициализировать перед запросом с нулем, то вроде как не гавкает. Чего вы там проверяете/высчитываете потом это неважно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2011, 17:01 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77, нравится мне ERROR_SUCCESS :) Поменял в выложенном Вами проекте объявление функции RegQueryValueEx и первый её вызов (получение размера). Падения прикратились. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
ЗЫ: Сачала пробовал поменять объявление на такое Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plaintext
Код: plaintext
Решение показалось черезчур диким. Пришлось включать мозг ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2011, 21:39 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
поправочъка к "ЗЫ": ... Падения, как и следовало ожидать прекратились. Но при получении значения Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2011, 21:47 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
скукотищаПоменял в выложенном Вами проекте объявление функции RegQueryValueEx и первый её вызов (получение размера). Падения прикратились. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Да, падения в моем рабочем (с реальными данными и в процессе их получения) также прекратились если этим воспользоваться. С одной стороны разумно. lDataLen = -1 кстати лишнее (и ничем не обосновано), проверьте. Если убрать + Optional в декларациях + передавать пустой предпоследний параметр вместо нуля, то будет ERROR_SUCCESS все равно. скукотищаДмитрий77, нравится мне ERROR_SUCCESS :) Может это правда только Ваша прихоть, не более? Ведь первоисточник гласит: первоисточник If the buffer specified by lpData parameter is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of the lpData buffer are undefined. -- If the lpData buffer is too small to receive the data, the function returns ERROR_MORE_DATA. Это в общем то согласуется с моим рабочим вариантом как бы, не так ли? При передаче нуля в lpData (szBuffer), он по определению всегда будет too small и никогда не будет large enough to hold the data, и всегда будет возвращать ERROR_MORE_DATA, ну кроме случая 2=Not Found, естественно. А с другой стороны..да действительно, в оригинале 3 последние параметра Opt. Как все-таки правильно то оставить? I. Вариант мой первый: Код: plaintext 1. 2. 3. 4. 5.
II. Вариант мой второй: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
III. Или вариант аля-Ваш: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 00:43 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77, учитывая мою привязанность к ERROR_SUCCESS я бы оставил третий вариант. И ещё бы поменял описание и вызовы функци RegQueryValueEx, чтобы добиться полного(?) соответствия описанию на msdn. Как результат - проще будет сопровождать код. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 01:07 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
скукотища, OK, спасибо, возможно воспользуюсь именно третьим вариантом. Подумаю об этом позже, когда закончу с рутиной. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 02:12 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
скукотищаДмитрий77, учитывая мою привязанность к ERROR_SUCCESS я бы оставил третий вариант. И ещё бы поменял описание и вызовы функци RegQueryValueEx, чтобы добиться полного(?) соответствия описанию на msdn. Как результат - проще будет сопровождать код. + Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вставил этот вариант (в лоб с декларацией RegQueryValueEx& как написано) в рабочее приложение. Время на "тестирование" как бы есть, посмотрю не грохнется ли случайно. Кстати, только сейчас обратил внимание: & -наверно long, $ -наверно string, % -я в растерянности А "по-человечески" (раз разбираетесь) можете записать с применением As Long, As String, As e.t.c ? Если не сложно, чтоб случайно не ошибиться и все не угробить... Или с $/&/% оставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2011, 15:32 |
|
chr(10)/chr(13) какие-то непонятки
|
|||
---|---|---|---|
#18+
Дмитрий77, по человечески Код: plaintext 1. 2. 3. 4. 5. 6.
! - Single, # - Double Long и String Вы правильно идентифицировали. авторИли с $/&/% оставить? Дело вкуса. Пишите, как Вам удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2011, 05:15 |
|
|
start [/forum/topic.php?fid=60&msg=37292628&tid=2158658]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 158ms |
0 / 0 |