Что именно делает AFX_MANAGE_STATE (AfxGetStaticModuleState ()) - PullRequest
16 голосов
/ 30 января 2012

Я использовал много модальных диалогов, и они прекрасно работали без использования AFX_MANAGE_STATE, но недавно я работал над другим проектом, в котором библиотеки ресурсов отличаются от запуска библиотеки DLL. Я просмотрел веб-страницу и обнаружил приведенную выше строку, и когда я вставил ее перед запуском диалога, все заработало. Я предполагаю, что, возможно, поскольку у нас разные dll, нам нужно загрузить состояние основной dll, чтобы запустить диалог, но я не уверен. Я нигде не смог найти хорошего объяснения в интернете. Может ли кто-нибудь объяснить простыми словами, что делает AFX_MANAGE_STATE и почему мне вдруг пришлось это использовать.

Спасибо.

Ответы [ 2 ]

19 голосов
/ 31 января 2012

Каждый .exe и .dll имеет дескриптор внутреннего ресурса, указывающий на ваши диалоги и другие ресурсы.Если вы вызываете функцию в своей DLL, текущий дескриптор ресурса указывает на ресурсы в .exe, что является неправильным и должно быть изменено на ресурсы DLL.

Это то, что делает AFX_MANAGE_STATE.

15 голосов
/ 25 февраля 2012

AFX_MANAGE_STATE - это макрос, который вызывает функцию ресурса, так что ресурс будет просматриваться только в этой DLL, а не в EXE / DLL, из которой вызывается определенная функция.Этот макрос также приводит к тому, что класс AFX_MAINTAIN_STATE помещается в стек.Этот класс при выходе из функции сбрасывает поиск ресурсов, так что EXE / DLL, вызвавшая эту экспортированную функцию, возвращает поиск ресурсов.

В терминах C ++:

// Some exported function that launches GUI or uses other resources
int GetSomething()
{
   AFX_MANAGE_STATE();
  ...
}

Было бы что-то вроде (не совсем):

int GetSomething()
{
       SetResourceSearchingToThisDLL();

       AFX_MAINTAIN_STATE state_RAII; 

       //Use resource

       // Compiler will put destroctor call for state_RAII object here
       // which will mean AFX_MAINTAIN_STATE::~AFX_MAINTAIN_STATE()
       // And that would call something like:
       ResetResourceSearching();
}

Использование этого макроса в одном стеке вызовов DLL никому не повредит, поскольку Resource-Searching имеет некоторый счетчик использования, который будет возвращаться к вызывающему (ресурс DLL / EXE), только если он достигнет 0.

Важно отметить, что не каждый MFCDLL должна использовать этот макрос.Это только в том случае, если DLL загружается не-MFC-клиентом, может быть C-клиентом, консольным приложением C ++, клиентом .NET и т. Д. (Да, также может быть клиентским приложением MFC для Windows).

Если ваши EXE и DLL сделаны в MFC, с использованием той же версии MFC / Compiler / linker и имеют один объект CWinApp, вам не нужно использовать этот макрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...