【问题标题】:Resource conflict on ON_UPDATE_COMMAND_UION_UPDATE_COMMAND_UI 上的资源冲突
【发布时间】: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_RESOURCEDLL_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 Projectmicrosoft.public.vc.mfc 发布过类似的问题,但并没有从那里得到太多有用的评论。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    看看这个很酷的工具:
    http://www.codeproject.com/KB/macros/resorg.aspx-

    另一个有用的帖子:
    MFC resource.h command/message IDs

    【讨论】:

    • 我尝试听取 resorg 的作者的意见。似乎避免ID冲突是最好的方法。 (也许是唯一的方法?)
    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多