Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161

Обёртка над WinApi платно

31.12.2018, 18:10. Показов 1738. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Среда - Code::Blocks_16.01

Я написал обёртку над окном WinApi которая реализует событейную модель.

Обёртка работает, написал даже на ней сложную программу ColorPicer.
Есть одно но, выскакивает ошибка времени выполнения, когда закрываю программу.

Уже почти месяц не могу найти причину ошибки. Готов заплатить за выявление ошибки.
Для выявления ошибки я упростил код до одного файла 126 строчек.

Связь: vk, Skayp(без камеры), Телефон; напишу в личке.
Я хочу понять именно эту ошибку, готовое решение не интересует, ну лишним не будет в общем-то!

Добавлено через 12 минут
Уже найдена точная строчка места появления ошибки, и даже причина ошибки, но почему так происходит, код-то вроде правильный.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.12.2018, 18:10
Ответы с готовыми решениями:

Обёртка над WinAPI
В архиве обычная обёртка над формой на WinApi, (ничего лишнего только класс формы); Чтобы создать форму в main.cpp объявлен класс MyWnd...

C++ класс обёртка над WinApi
Добрый вечер, друзья! Я пишу класс обёрту, для работы с файлами, над функциями WinApi. Как на мой взгляд, это хорошее решение. Можно...

Обёртка системных событий
Может кто подсказать варианты как можно обернуть системные события? В других библиотеках которые попадались мне в руки это реализовано...

9
134 / 26 / 8
Регистрация: 09.02.2017
Сообщений: 175
31.12.2018, 18:11
Прикрепите файл
0
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161
31.12.2018, 19:00  [ТС]
Минимальный(упращёный) проект debug, 1 файл 126 строк
Вложения
Тип файла: zip Минимальный.zip (601.6 Кб, 10 просмотров)
0
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161
31.12.2018, 19:28  [ТС]
Как хранятся обработчики:
Миниатюры
Обёртка над WinApi платно  
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
02.01.2019, 18:49
Лучший ответ Сообщение было отмечено Alkkcan как решение

Решение

Alkkcan, твоя ошибка вот в этих двух строчках:
C++
1
2
_msgmap.insert(std::pair<UINT, NodeMsgHandler>(message, *newNH));
delete temp1;
В map записывается копия выделенного в куче объекта. Эту копию нельзя удалять вручную через delete.

Добавлено через 11 минут
Вторая твоя проблема вот в этих строчках:
C++
1
2
result = (*temp->data)(NULL, &e); // дастаём обработчик из узла и вызываем его. !>>> здесь ошибка <<<!
temp = temp->pNext; // переходим к следующему узлу в цепочке.
При вызове AppDestroyMessage, происходит удаление элементов в map, и последующее обращение к temp скорее всего приведет к падению, т.к. соотвествующий объект уже удален.
1
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161
02.01.2019, 19:51  [ТС]
В map записывается копия выделенного в куче объекта.
Значит динамический newNH останется висеть в памяти после выполнения AppDestroyMessage а освободится его копия после команды _msgmap.clear();

Как тогда правильно оформить AddMessage и ~Form?

Так правильно?:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool Form::AddMessage(UINT message, MessageHandler func){
    if(!func) return false;
    std::map<UINT,NodeMsgHandler>::iterator it;
    it = _msgmap.find(message);
    if(it == _msgmap.end()){ // Если для данного сообщения нету обработчиков
        NodeMsgHandler autoNH(func);
        _msgmap.insert(std::pair<UINT,NodeMsgHandler>(message,autoNH));
    }
    else{
        NodeMsgHandler *newNH = new NodeMsgHandler(func); // этот добавляется не в карту а в цепочку NodeMsgHandler
        NodeMsgHandler *temp = &it->second;
        ContactNode::appendEnd(temp, newNH);
    }
    return true;
}
 
Как теперь должен выглядеть ~Form?
Вторая твоя проблема вот в этих строчках:
Хитрая ошибочка! Её смогу исправить, напишу потом.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
02.01.2019, 20:07
Цитата Сообщение от Alkkcan Посмотреть сообщение
Как теперь должен выглядеть ~Form?
Чтобы просто работало, достаточно сделать
C++
1
NodeMsgHandler *temp = it->second.pNext;

Но на твоем месте я бы прописал всем классам нормальные конструкторы, операторы присваивания и деструкторы, чтобы все автоматически зачищалось при вызове _msgmap.clear(). NodeMsgHandler это по факту обычный список указателей на функции. Можно его переписать под std::list или другой стандартный контейнер.

А так, твоя реализация напоминает MFC. Там тоже строится словарь из Winapi-сообщений и соответствующих им обработчиков.
1
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161
02.01.2019, 21:04  [ТС]
C++
1
NodeMsgHandler *temp = it->second.pNext;
Я понял, спасибо.
Но на твоем месте я бы прописал всем классам нормальные конструкторы, операторы присваивания и деструкторы
Конструктор нормальный вроде у NodeMsgHandler; деструктор не нужен, вдруг объект NodeMsgHandler будет не динамичный.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
02.01.2019, 21:09
Цитата Сообщение от Alkkcan Посмотреть сообщение
Конструктор нормальный вроде у NodeMsgHandler
У тебя нет нормального деструктора у класса NodeOne (да и инкапсуляции недостает), из-за этого тебе приходится где-то там в сторонке подтирать при очистке map.
0
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161
03.01.2019, 14:46  [ТС]
Кому нужна сама обёртка, пишите в личьку, напишу ссылку на обёртку, здесь ссылки запрещены.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2019, 14:46
Помогаю со студенческими работами здесь

Обёртка над Variable arguments
Здравствуйте! У меня есть вот такой шаблон: template&lt;typename TYPE&gt; vector&lt;TYPE&gt; MakeVector(int Count,...) { vector&lt;TYPE&gt;...

Своя обёртка над std::string
Добрый вечер, пишу парсер и часто пишу такого рода участки кода std::string QWE = node; QWE += &quot;/&quot;; ...

Класс обёртка
Стараюсь делать класс: ref class vectorByts { private: std::vector &lt; std::pair&lt;std::string, int&gt;&gt; *myVector; ...

Рефлексия, кодогенерация и обёртка
Доброго времени суток! Сначала прикладная задача: имеется статический класс, для которого необходимо делать не статическую обёртку....

Обёртка для padding
1)Друзья, напомните, как обрезать паддинги обёрткой.То есть если нужно сделать внутренние отступы в блоке, при уже разданных размерах, без...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru