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
, вам не нужно использовать этот макрос.