AFX_MANAGE_STATE(AfxGetStaticModuleState())完全做了什么

时间:2012-01-30 09:54:37

标签: c++ mfc

我使用了很多模态对话框,并且在没有使用AFX_MANAGE_STATE的情况下工作正常,但最近我正在开发一个不同的项目,其中资源dll与启动dll不同。我浏览网页并找到上面的行,当我在启动对话框之前插入它时,它工作正常。我想也许因为我们有不同的dll,我们需要加载主dll的状态才能启动对话框,但我不确定。我无法在互联网上的任何地方找到一个好的解释。任何人都可以用简单的语言解释AFX_MANAGE_STATE做了什么以及为什么我突然不得不使用它。

感谢。

2 个答案:

答案 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对象,则无需使用此宏。

相关问题