2012-01-30 18 views
12

He utilizado una gran cantidad de cuadros de diálogo modales y funcionó bien sin el uso de AFX_MANAGE_STATE, pero recientemente estaba trabajando en un proyecto diferente en el que los recursos dlls son diferentes del lanzamiento dll. Navegué por la web y descubrí la línea anterior y cuando la inserté antes de iniciar el diálogo, funcionó. Supongo que quizás ya que tenemos dlls diferentes, tenemos que cargar el estado de la dll principal para poder iniciar el diálogo, pero no estoy seguro. No he podido encontrar una buena explicación en Internet. ¿Alguien podría explicar en términos simples lo que AFX_MANAGE_STATE hace y por qué de repente tuve que usarlo?¿Qué hace AFX_MANAGE_STATE (AfxGetStaticModuleState()) exactamente

Gracias.

+0

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. –

Respuesta

17

Todos los .exe y .dll tienen un identificador interno de recursos, señalando sus diálogos y otros recursos. Si llama a una función en su archivo DLL, el manejador de recursos actual apunta a los recursos en .exe, lo cual es incorrecto y debe cambiarse a los recursos de la DLL.

Esto es lo que AFX_MANAGE_STATE hace.

14

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.

Cuestiones relacionadas