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