[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v2.6 (x86, x64)Скачать rgho.st, file.sampo.ruИсходник на pastebin'еНе сделано:
1. нет компоновки окон
2. нет настройки через ini-файл (игнор дисков)
3. нет сортировки списка дисков, что определяет и порядок проверки


Последний раз редактировалось: AZJIO (2019-01-18 04:28), всего редактировалось 30 раз(а)

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 1 год 9 месяцев
  • Сообщений: 122
  • Репутация:15

    [+] [-]
AZJIO, сейчас проверил - добавляет.
Со StringByteLength(valie, #PB_Unicode) результат такой же, как с StringByteLength(valie, #PB_Unicode) + SizeOf(Character).
Хотя по идее, так быть не должно. Защита от дурака, скорее всего. ИМХО, на неё не стоит полагаться (может не сработать, я проверял это несколько месяцев назад на другом компе, и точно помню, что там ничего не добавлялось), а делать надо по документации, которая ясно говорит if the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
60927AZJIO, сейчас проверил - добавляет.
Со StringByteLength(valie, #PB_Unicode) результат такой же, как с StringByteLength(valie, #PB_Unicode) + SizeOf(Character).
Хотя по идее, так быть не должно. Защита от дурака, скорее всего. ИМХО, на неё не стоит полагаться (может не сработать, я проверял это несколько месяцев назад на другом компе, и точно помню, что там ничего не добавлялось).
Я думаю добавление NULL скорее необходимо не реестру, а программе, которая будет извлекать данные из реестра, грубо говоря функция возвращает адрес строки с готовым null, чтобы с ней можно было сразу работать. А при импорте в реестр мы же в рег-файлах тоже не указываем никаких NULL (в рег-файлах десятки лет и в XP, и несколько лет в скриптах AutoIt3 и куче компов), значит реестр сам добавляет. Допустим я попытался добавить строку в которой в центре 3 раза NULL. реестр просто откинул всё после первого NULL, скорее он сам определил конец строки и добавил NULL или отрезал с первым NULL. Попробовал бинарные, вот тут он ничего не добавлял, внёс как есть. Так как реестр это база данных, то скорее всего у него все длины данных подсчитаны и NULL ему не нужен. Может я ошибаюсь, но иначе не оптимизировать данные не зная их размеры.
которая ясно говорит if the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters
Теоретически для чего тогда указывать длину? Если мы указываем адрес, то длину данных определяем либо количеством символов либо NULL. Если мы определяем длиной, то зачем NULL? Грубо говоря функция вроде имеет гибкость взять данные где то в центре какой то строки (математика адресов) с указанием длины. Ну если написано, значит надо, получается и для StringByteLength нужно добавлять 2 байта, вот только наверно при условии что строка является нуль-терминированной и берётся вся строка, а иначе туда попадёт как раз мусор.
_______________
Я кстати подумал посмотреть библиотеки по работе с реестром, тот же PureAutoIt (уже) и Droopy. И ещё интересует нужно ли указывать ключ /p который задаёт проверку в 3 этапа, на Win10 вообще не показывает, тупо запустил, проверил, перезагрузился.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 3 года 11 месяцев
  • Сообщений: 2296
  • Репутация:127

    [+] [-]
AZJIO
Api функции работы с реестром используют raw данные, именно поэтому и требуется длинна, сама api функция не понимает, что nul это конец данных.
Тип данных при работе с API не используется вообще, используются только raw данные.
Процесс записи состоит из двух частей конвертация исходного типа в raw и запись.
Чтение из реестра так-же состоит из двух частей - сначала с помощью api читаются raw данные и тип данных, далее происходит конвертация из raw в нужный тип.
Стандартный тип string предполагает, что nul является ограничителем строки, поэтому при конвертации строка обрежется до первого nul.
Конвертация данных лежит полностью на программисте, он может использовать свои типы данных, или нестандартно использовать существующий тип, например использовать dword для символьной строки и т.п.
Теоретически nul в конце не обязателен, но некоторые программы могут его использовать, так что стандартно он добавляется.

[Цитировать]

    Orochi
  • 14100
  • Стаж: 2 года 7 месяцев
  • Сообщений: 162
  • Репутация:0

    [+] [-]
AZJIO,
Можно ли добавить опцию выбора сразу всех дисков.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
Orochi, добавил, ссылка в шапке. Добавил мессагу после импорта в реестр.
а может ещё ссылку на eventvwr добавить? Чтобы открыть журнал для просмотра лога проверки... (с вызовом поиска Wininit) Вот описание

[Цитировать]

    Orochi
  • 14100
  • Стаж: 2 года 7 месяцев
  • Сообщений: 162
  • Репутация:0

    [+] [-]
AZJIO, Спасибо. ay Так на много удобнее, особенно если тестируешь кучу разделов.
Если нажать на кнопку справка, то программа показывает пустое окно с кнопкой ОК.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
Если нажать на кнопку справка, то программа показывает пустое окно с кнопкой ОК.
пока не знаю, у меня работает на Win10. А какая ОС? Там вызов "chkdsk.exe /?" с выводом результата в окно.

[Цитировать]

    Orochi
  • 14100
  • Стаж: 2 года 7 месяцев
  • Сообщений: 162
  • Репутация:0

    [+] [-]
60973А какая ОС? Там вызов "chkdsk.exe /?" с выводом результата в окно.
ОС Win 7 x64 Enterprise. Если вбить в консоле chkdsk.exe /?, то всё показывает.
Тяжело ли будет добавить опцию растягивать окно программы, хотя бы вертикально?


Последний раз редактировалось: Orochi (2019-01-14 00:47), всего редактировалось 1 раз

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
Orochi, пробуй с изменением размера

[Цитировать]

    Orochi
  • 14100
  • Стаж: 2 года 7 месяцев
  • Сообщений: 162
  • Репутация:0

    [+] [-]
AZJIO, Огромное Спасибо ay Работает отлично.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
nikzzzz, не помню в какой момент, то ли я тестил данные возвращаемые реестром в AutoIt3, но у меня сложилось понимание что фишка реестра как раз в том что он возвращает данные как раз не требующие конвертирования. Во первых при импорте в реестр мы определяем тип, соответственно реестр выделят размер для хранения. То что raw и так понятно, он не может записать иначе на жёсткий диск. А вот если я делаю чтение параметра в реестре, то уже не указываю тип, и если я ранее задал числовой формат некой ширины, то задав соответствующую переменную я получу данные и они будут соответствовать формату без конвертации. Возможно AutoIt3 преобразует, но факт что в переменной куда возвратятся данные если проверить её формат с помощью VarGetType, результат будет соответствовать типу данных реестра. Вот в этом как раз фишка реестра в отличии от ini, где надо использовать конвертирование данных.

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 1 год 9 месяцев
  • Сообщений: 122
  • Репутация:15

    [+] [-]
AZJIO, Это в AutoIt, а на чистом WinAPI нужно предварительно самому выделить буфер памяти достаточного размера, чтобы туда влезли данные. Если размера не хватит, данных не получите. Поэтому функцию чтения из реестра нужно вызывать дважды - первый, чтобы узнать нужный размер буфера (API сообщит его, если выделенный слишком мал), а второй уже для чтения.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
Добавил реакцию на подключение отключения флешки, но пока только в подсказку в заголовок. Стоит ли переделывать на полное обновления списка? Чтобы без перезапуска, или это лишнее.
Orochi, а точно надо выделять все диски? На данный момент если у тебя 3 физических диска, то удобнее запустить 3 копии программы и в каждой копии выделить диски принадлежащие одному физическому. Таким способом сократиться время проверки дисков в 3 раза. Допустим флешка проверится моментально и ей уже можно пользоваться, а огромный диск будет ещё час проверяться. А если запустить в одном окне, то нужно ждать час, пока прога сначала проверит локальные диски перед тем как приняться за флешку. Разницу видишь?
Gemostarter, посмотрел пример в AutoIt3 UDF _RegFunc.au3, там первый запрос RegQueryValueExW возвращает тип и размер, соответственно создаёт структуру lpData и использует её для второго запроса. А также там есть add terminating null для _RegWrite для строковых. Ранее я ей только пользовался.

[Цитировать]

    Orochi
  • 14100
  • Стаж: 2 года 7 месяцев
  • Сообщений: 162
  • Репутация:0

    [+] [-]
60980а точно надо выделять все диски? Разницу видишь?
Разницу конечно вижу. Я думаю этой опции смысл есть, но конечно тебе решать.
Например, поставил сканировать диски и пошёл пить кофе.
Кстати, нужно ждать час это когда сканируем с параметром /R ?
60980На данный момент если у тебя 3 физических диска, то удобнее запустить 3 копии программы и в каждой копии выделить диски принадлежащие одному физическому.
А почему не запустить программу один раз, а там уже выбрать разделы принадлежащие одному физическому диску и нажать старт. И как далее. Программа откроет новую проверку в новом окне консоли. Так же можно сначала запустить проверку флешки, а через секунду запустить проверку локальных дисков новом окне.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 10 месяцев 25 дней
  • Сообщений: 108
  • Репутация:37

    [+] [-]
60981А почему не запустить программу один раз, а там уже выбрать разделы принадлежащие одному физическому диску
Да работает, потестировал. RunProgram как бы запускает процесс и забывает о нём, то есть запускает cmd.exe, то получается да, выделил запустил и работает сам по себе. Видимо я сам уже запутался, когда хотели сделать собственные окна в разных потоках и отслеживать результаты направляя в окна.

Страница 10 из 13


Показать сообщения:    

Текущее время: 23-Янв 10:24

Часовой пояс: UTC + 3


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