![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| StillPhelix |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
Не работает декремент и xor. Коппилируется нормально. Не ребочие строки откоментированны. Исходник ниже.
Это сообщение отредактировал(а) StillPhelix - 27.1.2016, 19:52 |
|||
|
||||
| StillPhelix |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Это как так? Память под указатель не выделена, hKey указывает неизвестно куда...
Добавлено через 1 минуту и 52 секунды Должно быть:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| StillPhelix |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
прямая цитата из MSDN: PHKEY Pointer to an HKEY. This type is declared in WinDef.h as follows: typedef HANDLE *PHANDLE; Нет. Прямая цитата из MSDN: inline LSTATUS CAtlTransactionManager::RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD dwReserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition ); Проблема уже решена; смотри мой второй пост. Компилятор - visual studio 2010. Это чистый C++. Ваши правки подойдут только для MFC C++ и в этом случае не канают. |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Это я понял.
Это глупость. Дело, конечно, Ваше, но когда программа рухнет, не жалуйтесь. PS Вы бы хоть примеры посмотрели, что ли.
Вызов RegCreateKeyEx заносит результат по адресу phkResult, то есть по этому адресу обязана располагаться доступная память. Прямая цитата из MSDN:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| StillPhelix |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
MFC C++ не вызавает API. Вместо этого она обращается к библиотеке MFC, а та в свою очередь вызывает этот API. Чистый C++ вызывает API на прямую. Если не верите, то дизассемблируйте две программы, с соответствующими вызовами (на С++ и MFC C++). Все проекты MFC в 2 раза больше по размеру, чем проекты С++. И в visual studio они создаються разными путями. Переменная, содержащая адрес (hKey) и сам адрес - это две разные вещи. Поэтому, *hKey даст функции значение самой переменной, адрес которой храниться в hKey. Что и нужно данной API. Такой её прототип. Если вас интересует как работать с указателями, то прочитайте об этом, например в этой книге : Харви М. Дейтел, Пол Дж. Дейтел Как программировать на C++ (2008). Вобщем, &res - это адрес. А hKey, переменная, содержащая адрес. Поэтому программа не рухнет. С точки зрения С++ и компилятора С++ она написана правильно. |
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Раз уж Вы так рьяно рассказываете про С++ и советуете читать книги (при этом не самые удачные, ИМХО), то feodorv Вас совершенно правильно ткнул носом в тот факт, что указатель hKey у Вас есть, но вот на что он указывает никому не известно. По стандарту С++ указатели не инициализируются значениями по умолчанию. Таким образом, в один "прекрасный" момент, ваш hKey будет указывать на какой-нибудь участок памяти, который, при записи в него из Вашей программы, сможет вызвать серьезную ошибку в работе ОС. Так что прежде чем грубить, попытайтесь понять, что до Вас хотят донести
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
2 ТС - очень рекомендуется почитать буквари (можно те, что сами тут и упоминули) прежде чем нести ахинею прикрываясь красивыми словами про MFC/API/C++/прототипы
|
|||
|
||||
| StillPhelix |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
baldman88,
xvr,
В этой строке инициализируется дескриптор. |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В этой строке вызов RegCreateKeyEx запишет по указателю hKey ваш дескриптор. Так как этот указатель никто не инициализировал, то и попадет он неизвестно куда. Вам повезло, что там оказалась память и она ни с кем не пересеклась. Напишите в строке 13 ( PHKEY hKey;) так -
|
||||||
|
|||||||
| StillPhelix |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
это значит, что компилятор выделяет переменной hKey память и адрес. А код
её и так инициализирует. Адрес-то этой переменной функции известен. Памать под переменную выделена. Поэтому обнулять эту переменную смысла никакого нет. Это же не счётчик. Современный оптимизирующий копилятор из кода
= NULL скорее всего выбросит. Я эту программу прогонял не только через отладчик (visual studio и winDbg), но и дизассемблер. Код полностью работоспособен. Можете проверить сами. |
||||||||
|
|||||||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Я только сейчас понял, что эта функция делает. Видимо внутри она делает что-то вроде:
Мда. Такое уродливое API еще поискать нужно. Надеюсь никогда не доведется с ним иметь дело. |
|||
|
||||
| StillPhelix |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.1.2016 Репутация: нет Всего: нет |
Если коротко, то в SDK от Microsoft, сказано следующее. RegCreateKeyEx передаёт адрес дескриптора созданного ключа в переменную, адрес которой храниться в указателе типа PHKEY ( это hKey). А PHKEY, в свою очередь, указывает на HKEY. RegQueryValueEx, RegSetValueEx и RegSetValueEx требуют значение дескриптора. Сам дескриптор - показывает на нужный объект. Для этого указатель hKey нужно разыменовать. Поэтому пишем: *hKey.
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
В логике Вам не окажешь. Осталось только понять, где именно в коде
Данный код никоим образом не может проинициализировать переменную hKey, то есть присвоить ей какой-либо адрес типа PHKEY. Но может по адресу, который хранится в hKey, записать какое-либо значение типа HKEY (что не есть инициализация hKey). Поскольку адрес, хранящийся в переменной hKey, мусорный (hKey-то не инициализирована), то и запись возвращаемого функцией RegCreateKeyEx значения типа HKEY произойдёт по мусорному адресу. И адрес какой именно переменной известен функции RegCreateKeyEx? Современный компилятор на подобные конструкции выдаёт предупреждение об использовании переменной hKey без инициализации. У Вас такое предупреждение есть? Добавлено через 2 минуты и 9 секунд Зря Вы так. Тогда и fopen тоже уродлив. Что же не уродливо? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
Про fopen не соглашусь, там все интуитивно понятно. Передаем имя файла и режим в котором хотим открыть файл. В случае успеха получаем адрес, а в случае неудачи -- NULL. Здесь же 100500 параметров, да еще и непонятно что передавать. То ли нужно передать указатель на уже выделенную память, то ли просто указатель, в который будет занесен адрес памяти, которая будет выделена в функции. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |