| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Работа с реестром на API |
| Автор: TeX 27.10.2008, 16:18 |
| Здравствуйте уважаемые ! Пишу сервис, который должен проверять определенные ветки реестра (), на появление "левых" записей. Подскажите как правильно работать с реестром из сервиса с помощью API. Я нашел похожую тему, но там было только создание и удаление и то , из обычного приложения. Хорошо было бы если примерчик дадите. |
| Автор: ne0n 27.10.2008, 21:49 |
| TeX, http://delphiworld.narod.ru/base/registry_api.html |
| Автор: TeX 28.10.2008, 08:45 | ||
Спасибо за ссылку, очень полезная, НО... хотелось бы разобраться как работать с реестром с помощью функций из ntdll.dll. |
| Автор: TeX 28.10.2008, 14:43 | ||
За наводку на книгу, спасибо, найду-почитаю. У JEDI нашел интерфейсный модуль Windows NT Native API для delphi, в котором описаны все структуры, процедуры и функции. Вот сижу сейчас разбираюсь с этим. |
| Автор: TeX 30.10.2008, 10:29 | ||||||
| Два дня упражнений привели лишь к номальному открытию ветки реестра, а вот с чтением туго. Подскажите ка работать с функцией
Загвоздка в буфере, куда будет помещена информация. В зависимости KeyValueInformationClass должны использоваться разные структуры, описания которых в интерфейсном модуле нет. Пришлось самому сделать эту структуру:
Вод код процедуры:
При работе возникает исключение, что-то я неправильно делаю и скорее что-то с выделением памяти, но где не могу понять. |
| Автор: Riply 31.10.2008, 08:02 | ||||
Если мне не изменяет память они все (структуры) есть в MSDN При использовании "системных" функций, отсебятина в определении структур недопустима (за исключением очень редких случаев) При переводе структур с С на Delphi, внимательно следи не тлько за размером всей стр-ры, но и каждого поля в отдельности. Это было вступление, теперь бегло взглянем на код и ужаснемся
1. Для чего в данной строчке определяется Status ? 2. С чего ты взял, что если NtQueryValueKey отработает с ошибкой, то будет произведена запись в DataSize (которая, меду прочим, не инициализирована, но это "к слову") ? 3. Зачем вообще ты пытался получить DataSize, если после этого выделяешь память таким образом data:=AllocMem(sizeof(KEY_VALUE_PARTIAL_INFORMATION)); ? 4. Почему в память размера sizeof(KEY_VALUE_PARTIAL_INFORMATION) ты пишешь DataSize байт, а потом еще удивляешся на AV ? 5. Где освобождение памяти ? 6. Почему не используются try/finally ? Мое IMHO: рановато тебе еще работать с Native-функциями. Просто приведенный кусок кода показывает полное непонимание его автором того что в нем (коде) происходит. Дружеский совет: почитай книжки (акцентируй внимание на работе с памятью и с ошибками). |
| Автор: TeX 31.10.2008, 09:01 | ||||||||||||
Спасибо за критику. Я действительно с Native и API столкнулся недавно, поэтому такой сумбур, но я учусь, а это немаловажно. поэтому и задаю вопросы, чтобы объяснили, а не отсылали к книжкам. А теперь по существу.
Он, Status, в этой строке впринципе и не нужен, просто copy/paste. Функция действительно отрабатывает с ошибкой, но размер структуры в DataSize выдает, проверено. Не инициализирована переменная, потому что это просто наброск, черновик.
После долго перелопачивания MSDN и кучи кода на С, просто запутался. Но Я с этим разобрался, код переписал, см. ниже.
Я говорил, это только черновик. А теперь далее. Немного подправил код: Описание структуры, которой нехватало в заголовочном файле, взял из MSDN, получилось вот так:
Все заработало, единственное, может какие будут замечания по поводу, кода. Готов принять конструктивную критику. |
| Автор: Riply 31.10.2008, 18:14 | ||||||
Мне казалось, что перед тем, как послать я довольно подробно расписала ошибки, которые бросаются в глаза Еще как нужен Более того, все дальнейшие шаги по чтению возможны только при определенных его значениях (см MSDN) и они (шаги) зависят от этого значения. (Например нет такого ValueName) То что десять раз выдало, вовсе не означает, что выдаст и на следующий. Доказательством "выдавания" может служить только документация или исходный код процедуры NtQueryValueKey
Нет в программировании такого понятия как черновик. Или ты тестируешь один код (черновой), оттестировал, а использовать будешь совсем другой (чистовой). Зачем тогда было тестировать черновой вариант ? Это раз. Второе: ты привел код с просьбой найти ошибку. Я и ищу ошибку в приведенном коде, а не телепатирую, что ты собираешся исправить в чистовом варианте Теперь по коду:
Я уж молчу про то что NtQueryValueKey может отработать с ошибкой Следующие за ней две строчки показывают, что я не ошиблась отсылая тебя к книжкам: ты действительно совершенно не понимаешь как работают с памятью. Дальше смотреть не стала, ибо пока ты не прочитаешь книжку (на чем ставить акцент я уже говорила) дальнейшее обсуждение принципов работы Native-функций не имеет смысла. |
| Автор: TeX 1.11.2008, 16:24 | ||||
| Полностью соглашусь со всем вышенаписанным. Тогда другой вопрос, какие книжки, по вашему мнению, стоит прочитать, чтоб разбираться, так же как и Вы ?
О ужас Переделал так:
Абосную выбор. AllocMem делает getMem и заполняет память нулями. |
| Автор: Riply 1.11.2008, 20:19 |
Пройдись поиском по форуму. Здесь не только давали голые ссылки на литературу, но и сопровождали их своими отзывами. IMHO - это помогает выбрать нужную исходя из своего уровня подготовки. Я же конкретную книгу посоветовать не могу, т.к. не знаю этого уровня. Но лично мне очень помог Рихтер. Он у меня и сейчас - "настольная книга" в прямом и переносном смысле По коду: настоятельно рекомендую не опираться на возвращаемое значение DataSize, а анализировать код возврата NtQueryValueKey (возможные коды должны быть в MSDN). Насчет памяти, пока можно(нужно) и так. А когда научишся правильно обрабатывать возвращаемое значение ф-ии, то затирание памяти станет избыточным и его можно будет убрать. Незачем загружать процессор излишней работой. Ему тоже отдохнуть хочется |