我使用了很多模态对话框,并且在没有使用AFX_MANAGE_STATE
的情况下工作正常,但最近我正在开发一个不同的项目,其中资源dll与启动dll不同。我浏览网页并找到上面的行,当我在启动对话框之前插入它时,它工作正常。我想也许因为我们有不同的dll,我们需要加载主dll的状态才能启动对话框,但我不确定。我无法在互联网上的任何地方找到一个好的解释。任何人都可以用简单的语言解释AFX_MANAGE_STATE
做了什么以及为什么我突然不得不使用它。
感谢。
答案 0 :(得分:19)
每个.exe和.dll都有一个内部资源句柄,指向您的对话框和其他资源。如果在DLL中调用函数,则当前资源句柄指向.exe中的资源,这是错误的,需要更改为DLL的资源。
这是AFX_MANAGE_STATE
的作用。
答案 1 :(得分:15)
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调用堆栈中使用此宏不会伤害任何人,因为资源搜索有一些使用计数器,只有当它达到0时才会恢复为调用者(DLL / EXE资源)
重要的是要注意,并非每个MFC DLL都必须使用此宏。只有当DLL由非MFC客户端加载时,可能是由C客户端,基于C ++控制台的应用程序,.NET客户端等(是的,也可能是MFC Windows应用程序客户端)。
如果您的EXE和DLL是在MFC中制作的,使用相同的MFC /编译器/链接器版本并且有一个CWinApp
对象,则无需使用此宏。