【发布时间】:2010-10-07 00:50:46
【问题描述】:
我有一个 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 类有一个 ID 为 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 发布过类似的问题,但并没有从那里得到太多有用的评论。
【问题讨论】: