Поделиться через


Управление данными состояния модулей MFC

В этой статье рассматриваются данные о состоянии модулей MFC и их обновление, когда поток выполнения (код пути принимает приложение при выполнении) вводит и покидает модуль. Также рассматривается переключение состояний модуля с помощью AFX_MANAGE_STATE и макросов METHOD_PROLOGUE.

Примечание.

Термин "модуль" здесь относится к исполняемой программе или библиотеке DLL (или набору БИБЛИОТЕК DLL), которые работают независимо от остальной части приложения, но используют общую копию библиотеки DLL MFC. Элемент управления ActiveX является типичным примером модуля.

Как показано на следующем рисунке, MFC содержит данные о состоянии для каждого модуля, используемого в приложении. Примерами этих данных являются дескрипторы экземпляров Windows (используемые для загрузки ресурсов), указатели на текущие CWinApp и CWinThread объекты приложения, счетчики ссылок на модуль OLE и различные карты, поддерживающие соединения между дескрипторами объектов Windows и соответствующими экземплярами объектов MFC. Однако, если приложение использует несколько модулей, данные о состоянии каждого модуля не являются широкими. Вместо этого каждый модуль имеет собственную частную копию данных состояния MFC.

Diagram showing the state data of a single module.
Данные о состоянии одного модуля (приложения)

Данные о состоянии модуля содержатся в структуре и всегда доступны с помощью указателя на ту структуру. Когда поток выполнения входит в определенный модуль, как показано на следующем рисунке, состояние модуля должно быть текущим или эффективным. Таким образом, каждый объект потока имеет указатель на эффективную структуру состояния этого приложения. Постоянно обновляя этот указатель, важно управлять глобальным состоянием приложения и поддерживать целостность состояния каждого модуля. Неправильное управление глобальным состоянием может привести к непредсказуемому поведению приложения.

State data of multiple modules.
Данные о состоянии нескольких модулей

Другими словами, каждый модуль отвечает за правильное переключение между состояниями модуля во всех его точках входа. Точка входа — это любое место, в котором поток выполнения может ввести код модуля. К точкам входа относятся:

См. также

Общие разделы по MFC