Member 12823218 Ответов: 2

Почему win32 api перестает показывать windows


У меня есть программа Win32 API windows, которая отображает txt-файл, содержащий французский документ. Я могу нажать на слово, и программа прочитает файл словаря, откроет окно редактирования и отобразит английское определение, тип и время. После нескольких запросов программа перестает отображать результаты. На самом деле любые щелчки мыши, по-видимому, не дают никаких результатов (включая щелчки по панели инструментов и полосе прокрутки). Щелчок правой кнопкой мыши должен вызвать появление MessageBox, но этого не происходит.
При отслеживании моей программы я вижу, что программа ведет себя так, как будто она работает, но никаких окон не появляется и никакого отображаемого текста не появляется.
Я повторно использую окно редактирования и просто изменяю его размер и перемещаю (вместо того, чтобы удалять и воссоздавать его для каждого определения), поэтому я попытался создать его, когда это было необходимо, и удалить, когда это было сделано, но никаких изменений.
Я также создаю глобальный шрифт при запуске и применяю его при необходимости, поэтому я попробовал его без шрифта, но опять же без изменений.
Когда я компилирую с помощью CodeBlocks, программа перестает отображаться примерно после 45 запросов. Когда я компилирую с DevCpp, проблема возникает примерно после 20 запросов. Я также следил за GlobalMemoryStatus, но там, похоже, много памяти, так что я не могу списать это на утечку памяти. Это почти как если бы я выбежал из какой-то структуры windows, но я не знаю, что?
Программа содержит ~1300 строк, поэтому я не знаю, есть ли подмножество, которое могло бы проиллюстрировать причину, но опубликует выбранные блоки кода, если я знаю, что может помочь.
У кого-нибудь есть какие-нибудь предложения?

Что я уже пробовал:

удаление ненужных шрифтов, повторное использование диалогов, ненужных кистей, различных компиляторов.

Richard MacCutchan

Проблема может быть вызвана любой из множества проблем, но единственный способ выяснить это-провести некоторую отладку. Здесь никто не может догадаться, что делает ваш код.

2 Ответов

Рейтинг:
1

Member 12823218

Я нашел HBRUSH, который был определен и возвращен из WM_CTLCOLORDLG, но никогда не выбирался, {SelectObject(hdc, ywBrush)} и не удалялся {DeleteObject(ywBrush)}. Внимательное чтение WM_CTLCOLORDLG показало, что мне нужно удалить этот объект, когда он больше не нужен. Я сделал HBRUSH глобальной переменной (mea culpa), и проблема исчезла. Спасибо за всю помощь
Стив Кинг


Рейтинг:
0

KarstenK

Во-первых: если вы создаете системный ресурс, например файл или дескриптор шрифта, вы должны освободить его после использования. Для HFONT необходимо вызвать DeleteObject.

Инструмент Исследователь Процессов от Microsoft может помочь вам найти проблему. Когда я читаю ваш текст, я предполагаю, что, возможно, некоторые файлы не будут закрыты, и вы в конечном итоге получите много дескрипторов файлов или какой-то блокирующий файловый API.

Если это не так просто, то Ричард совершенно прав, что вам придется работать с отладчиком. Сначала вы должны понять рабочий процесс программы и добавить некоторые сообщения журнала, и, возможно, это поможет переключить некоторые пути кода, чтобы найти ошибку.


Member 12823218

Спасибо за совет о Process Explorer, это именно то, что мне нужно. Я запускал его пару раз, но там так много информации, что я не уверен, что происходит (пока). Похоже, что существует множество дескрипторов, включая множество дескрипторов <unknown type="">. (не знаю, в этом ли проблема) но я продолжаю исследовать. Не похоже, что я оставил какие-либо из своих файлов открытыми, но там есть множество дескрипторов событий, поэтому я проверю, правильно ли я обработал события в своей процедуре обратного вызова. Любые другие советы будут оценены по достоинству.
Еще раз спасибо за помощь
Стив Кинг