![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| TeX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.12.2007 Репутация: нет Всего: нет |
Здравствуйте уважаемые !
Пишу сервис, который должен проверять определенные ветки реестра (), на появление "левых" записей. Подскажите как правильно работать с реестром из сервиса с помощью API. Я нашел похожую тему, но там было только создание и удаление и то , из обычного приложения. Хорошо было бы если примерчик дадите. Это сообщение отредактировал(а) TeX - 27.10.2008, 16:20 |
|||
|
||||
| ne0n |
|
|||
|
PlayBoy ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 5.8.2005 Где: Н.Новгород Репутация: 4 Всего: 11 |
||||
|
||||
| TeX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.12.2007 Репутация: нет Всего: нет |
Спасибо за ссылку, очень полезная, НО... хотелось бы разобраться как работать с реестром с помощью функций из ntdll.dll. |
|||
|
||||
| ne0n |
|
|||
|
PlayBoy ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 5.8.2005 Где: Н.Новгород Репутация: 4 Всего: 11 |
так и надо было сказать что нужно именно Native Api, Вообщем есть очень хорошая книга - Справочник по базовым функциям API Windows NT/2000, Гэри Неббет. Есть глава посвященная реестру, в которой все подробно расписано. Но там все прототипы приводяться для C++, для Delphi я вроде не встречал подоного. При желании перевести не сложно. |
|||
|
||||
| TeX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.12.2007 Репутация: нет Всего: нет |
За наводку на книгу, спасибо, найду-почитаю. У JEDI нашел интерфейсный модуль Windows NT Native API для delphi, в котором описаны все структуры, процедуры и функции. Вот сижу сейчас разбираюсь с этим. |
|||
|
||||
| TeX |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.12.2007 Репутация: нет Всего: нет |
Два дня упражнений привели лишь к номальному открытию ветки реестра, а вот с чтением туго.
Подскажите ка работать с функцией
Загвоздка в буфере, куда будет помещена информация. В зависимости KeyValueInformationClass должны использоваться разные структуры, описания которых в интерфейсном модуле нет. Пришлось самому сделать эту структуру:
Вод код процедуры:
При работе возникает исключение, что-то я неправильно делаю и скорее что-то с выделением памяти, но где не могу понять. |
||||||
|
|||||||
| Riply |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Если мне не изменяет память они все (структуры) есть в 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 |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.12.2007 Репутация: нет Всего: нет |
Спасибо за критику. Я действительно с Native и API столкнулся недавно, поэтому такой сумбур, но я учусь, а это немаловажно. поэтому и задаю вопросы, чтобы объяснили, а не отсылали к книжкам. А теперь по существу.
Он, Status, в этой строке впринципе и не нужен, просто copy/paste. Функция действительно отрабатывает с ошибкой, но размер структуры в DataSize выдает, проверено. Не инициализирована переменная, потому что это просто наброск, черновик.
После долго перелопачивания MSDN и кучи кода на С, просто запутался. Но Я с этим разобрался, код переписал, см. ниже.
Я говорил, это только черновик. А теперь далее. Немного подправил код: Описание структуры, которой нехватало в заголовочном файле, взял из MSDN, получилось вот так:
Все заработало, единственное, может какие будут замечания по поводу, кода. Готов принять конструктивную критику. Это сообщение отредактировал(а) TeX - 31.10.2008, 10:06 |
||||||||||||
|
|||||||||||||
| Riply |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Мне казалось, что перед тем, как послать я довольно подробно расписала ошибки, которые бросаются в глаза Еще как нужен Более того, все дальнейшие шаги по чтению возможны только при определенных его значениях (см MSDN) и они (шаги) зависят от этого значения. (Например нет такого ValueName) То что десять раз выдало, вовсе не означает, что выдаст и на следующий. Доказательством "выдавания" может служить только документация или исходный код процедуры NtQueryValueKey
Нет в программировании такого понятия как черновик. Или ты тестируешь один код (черновой), оттестировал, а использовать будешь совсем другой (чистовой). Зачем тогда было тестировать черновой вариант ? Это раз. Второе: ты привел код с просьбой найти ошибку. Я и ищу ошибку в приведенном коде, а не телепатирую, что ты собираешся исправить в чистовом варианте Теперь по коду:
Я уж молчу про то что NtQueryValueKey может отработать с ошибкой Следующие за ней две строчки показывают, что я не ошиблась отсылая тебя к книжкам: ты действительно совершенно не понимаешь как работают с памятью. Дальше смотреть не стала, ибо пока ты не прочитаешь книжку (на чем ставить акцент я уже говорила) дальнейшее обсуждение принципов работы Native-функций не имеет смысла. Это сообщение отредактировал(а) Riply - 31.10.2008, 18:20 |
||||||
|
|||||||
| TeX |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.12.2007 Репутация: нет Всего: нет |
Полностью соглашусь со всем вышенаписанным.
Тогда другой вопрос, какие книжки, по вашему мнению, стоит прочитать, чтоб разбираться, так же как и Вы ?
О ужас Переделал так:
Абосную выбор. AllocMem делает getMem и заполняет память нулями. Это сообщение отредактировал(а) TeX - 1.11.2008, 16:52 |
||||
|
|||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Пройдись поиском по форуму. Здесь не только давали голые ссылки на литературу, но и сопровождали их своими отзывами. IMHO - это помогает выбрать нужную исходя из своего уровня подготовки. Я же конкретную книгу посоветовать не могу, т.к. не знаю этого уровня. Но лично мне очень помог Рихтер. Он у меня и сейчас - "настольная книга" в прямом и переносном смысле По коду: настоятельно рекомендую не опираться на возвращаемое значение DataSize, а анализировать код возврата NtQueryValueKey (возможные коды должны быть в MSDN). Насчет памяти, пока можно(нужно) и так. А когда научишся правильно обрабатывать возвращаемое значение ф-ии, то затирание памяти станет избыточным и его можно будет убрать. Незачем загружать процессор излишней работой. Ему тоже отдохнуть хочется Это сообщение отредактировал(а) Riply - 1.11.2008, 20:23 |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |