AFX_MANAGE_STATE
es una macro que llama a la función de recursos para que el recurso se busque solo en esta DLL, y no en el EXE/DLL desde el que se llama a una función en particular. Esta macro también provoca que la clase AFX_MAINTAIN_STATE
se ponga en la pila. Esta clase, al salir de la función, restablecería la búsqueda de recursos, de modo que EXE/DLL que llamó a esta función exportada lo haga volver a la búsqueda de recursos.
En términos de C++:
// Some exported function that launches GUI or uses other resources
int GetSomething()
{
AFX_MANAGE_STATE();
...
}
sería algo similar (no exactamente):
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();
}
El uso de esta macro, dentro de la misma pila de llamadas DLL no lastimará a nadie, ya que Recursos-Búsqueda tiene algún contador de uso, que revertirá a la persona que llama (recurso DLL/EXE) solo si alcanza 0.
Es importante tener en cuenta que, no t cada archivo DLL de MFC tiene que usar esta macro. Es solo si DLL es cargado por un cliente que no es MFC, puede ser por un cliente C, una aplicación basada en una consola C++, un cliente .NET, etc. (sí, también puede ser un cliente de aplicaciones Windows MFC).
Si su EXE y DLL están hechos en MFC, utilizando la misma versión de MFC/compilador/enlazador y tiene un objeto CWinApp
, no necesita usar esta macro.
La Nota técnica de Microsoft 058, Implementación estatal de módulos MFC, contiene información adicional sobre el uso de AFX_MANAGE_STATE. https://msdn.microsoft.com/en-us/library/vstudio/ft1t4bbc(v=vs.100).aspx aunque puede ser un poco anticuado. –