我有一个EXE类,其中包含ID为EXE_BUTTON_RESOURCE
ON_UPDATE_COMMAND_UI(EXE_BUTTON_RESOURCE, OnUpdateExeButtonResource)
void EXE::OnUpdateExeButtonResource(CCmdUI* pCmdUI)
{
pCmdUI->Enable(exe_flag);
}
此EXE应用程序将加载另一个DLL类。
DLL类有一个标识为DLL_MENU_RESOURCE
的菜单项资源。
不幸的是,EXE_BUTTON_RESOURCE
和DLL_MENU_RESOURCE
具有相同的资源ID。为了避免它们,冲突ID非常困难,因为它们是两个独立的项目。
每当exe_flag(EXE的成员)变为false时,这也会影响DLL中的菜单。单击DLL_MENU_RESOURCE
菜单将完全没有效果。
如何避免这个陷阱?对他们的resource.h文件进行手动检查不是我的选择,因为它们是2个独立的项目,由2个独立的团队管理。
有一次,我认为这可能是资源冲突的问题。因此,在显示右键菜单的DLL代码中,我有以下代码加载DLL资源,并在完成后还原EXE资源。
void DLL::OnContextMenu(CWnd* pWnd, CPoint point)
{
RestoreDLLState ext;
...
}
RestoreDLLState将加载全局DLL资源,并在完成后加载其原始资源。
RestoreDLLState::RestoreDLLState()
{
m_hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(g_hDLLResource);
}
RestoreDLLState::~RestoreDLLState()
{
AfxSetResourceHandle(m_hInstOld);
}
这不起作用。我的猜测是,启用/禁用具有特定ID的资源的操作将从EXE传播到DLL,无论当前正在加载什么是默认资源。
说实话,我已将相似的问题发布到Code Project和microsoft.public.vc.mfc,但没有从那里得到很多有用的评论。
答案 0 :(得分:1)
检查一下这个很酷的工具:
http://www.codeproject.com/KB/macros/resorg.aspx-
另一个有用的帖子:
MFC resource.h command/message IDs