C++ AFX_管理_状态(AFXGetStaticModuleEstate())的具体功能是什么

C++ AFX_管理_状态(AFXGetStaticModuleEstate())的具体功能是什么,c++,mfc,C++,Mfc,我使用了很多模态对话框,它们在没有使用AFX\u MANAGE\u STATE的情况下工作得很好,但最近我正在从事一个不同的项目,其中资源dll与启动dll不同。我在网上冲浪,找到了上面这一行,当我在启动对话框之前插入它时,它就工作了。我想可能因为我们有不同的dll,我们需要加载主dll的状态才能启动对话框,但我不确定。我在互联网上的任何地方都找不到一个好的解释。谁能简单地解释一下AFX管理州的功能以及我为什么突然不得不使用它 谢谢。每个.exe和.dll都有一个内部资源句柄,指向对话框和其他资

我使用了很多模态对话框,它们在没有使用AFX\u MANAGE\u STATE的情况下工作得很好,但最近我正在从事一个不同的项目,其中资源dll与启动dll不同。我在网上冲浪,找到了上面这一行,当我在启动对话框之前插入它时,它就工作了。我想可能因为我们有不同的dll,我们需要加载主dll的状态才能启动对话框,但我不确定。我在互联网上的任何地方都找不到一个好的解释。谁能简单地解释一下AFX管理州的功能以及我为什么突然不得不使用它


谢谢。

每个.exe和.dll都有一个内部资源句柄,指向对话框和其他资源。如果调用DLL中的函数,则当前资源句柄指向.exe中的资源,这是错误的,需要更改为DLL的资源


这就是
AFX\u MANAGE\u STATE
所做的。

AFX\u MANAGE\u STATE
是一个调用资源函数的宏,因此只能在该DLL中查找资源,而不能在调用特定函数的EXE/DLL中查找资源。此宏还导致将
AFX\u维护\u状态
类放在堆栈上。该类将在函数退出时重置资源查找,以便调用该导出函数的EXE/DLL将其返回资源搜索

C++中的P>:

// Some exported function that launches GUI or uses other resources
int GetSomething()
{
   AFX_MANAGE_STATE();
  ...
}
可能是(不完全是):

在同一DLL调用堆栈中使用此宏不会伤害任何人,因为资源搜索有一些使用计数器,只有当它达到0时才会还原为调用方(DLL/EXE资源)

需要注意的是,并非每个MFC DLL都必须使用此宏。只有当DLL由非MFC客户端加载时,才可以由C客户端、基于C++控制台的应用程序、.NET客户端等(是的,也可以是MFC Windows应用程序客户端)。p>
如果EXE和DLL是在MFC中生成的,使用相同的MFC/编译器/链接器版本,并且有一个
CWinApp
对象,则不需要使用此宏

Microsoft技术说明058“MFC模块状态实现”提供了一些有关使用AFX_管理_状态的附加信息。虽然可能有点过时。
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();
}