Visual c++ 资源ID在我的共享MFC DLL中应该是唯一的吗

Visual c++ 资源ID在我的共享MFC DLL中应该是唯一的吗,visual-c++,mfc,Visual C++,Mfc,示例:第一个MFC DLL在resource.h中有一个ID为4711的菜单ID_menu_FOO。第二个MFC DLL还有另一个具有相同ID值4711的菜单ID_menu_栏。 应用程序exe同时使用DLL和调用。如果我想验证要加载的所需菜单,我需要调用API方法,将模块句柄赋予所需的dll。还是我错了 在我自己的项目中处理资源ID及其唯一性的最佳实践是什么 提前谢谢 汉斯·帕桑给出了答案 跨模块使用资源不是最佳做法。正确地划分代码,一个窗口使用一个菜单,所以只需确保该窗口的所有实现细节都在同

示例:第一个MFC DLL在resource.h中有一个ID为4711的菜单ID_menu_FOO。第二个MFC DLL还有另一个具有相同ID值4711的菜单ID_menu_栏。 应用程序exe同时使用DLL和调用。如果我想验证要加载的所需菜单,我需要调用API方法,将模块句柄赋予所需的dll。还是我错了

在我自己的项目中处理资源ID及其唯一性的最佳实践是什么


提前谢谢

汉斯·帕桑给出了答案

跨模块使用资源不是最佳做法。正确地划分代码,一个窗口使用一个菜单,所以只需确保该窗口的所有实现细节都在同一个模块中


这取决于你拥有的模块类型。加载资源alwway需要一个从何处加载资源的句柄

如果使用扩展模块DLL,则EXE和DLL中的所有资源ID在MFC中必须是唯一的。因此,对于扩展模块,资源位于何处并不重要。MFC装载机将通过所有扩展模块

如果您只是在MFC中使用标准DLL,那么所有资源都是分开的。DLL和EXE中的每个CWinApp模块是分开的,并且都有自己的搜索路径和Afx资源句柄。资源处理也是调用AFX_MANAGA_状态的原因之一。它保存当前资源句柄并设置一个新的句柄,在离开函数后恢复旧的句柄

因此,这取决于你拥有什么以及你想如何设计你的程序。因为我有一堆扩展DLL,所以我有用于每个模块中ID的特定范围。标准的自我护理,而不涉及现有扩展DLL的范围,因为它们也可以在标准DLL搜索路径中找到

我忘了说:只有将MFC用作共享DLL时,这一切才是重要的。否则每个模块都有自己的资源句柄


以其他方式共享资源是可能的。您可能有自己的加载程序来获取它们…

当然,它们应该是唯一的,但为什么?通常我不关心这些值,只是添加资源。但有时当一个库或应用程序本身获得新资源时,应用程序加载错误的菜单或图像或其他内容,因为新ID使另一个库的现有资源ID不再唯一。这个问题没有任何意义,库不能有任何资源。IDE不会阻止您创建它们,但它们需要链接到DLL或EXE中才能使用。对不起,我是说共享MFC DLL,我修复了questionLoadMenu需要模块句柄的问题。这必须是DLL中的一个。存储在不同模块中的资源可以具有相同的ID,模块句柄避免了歧义。术语非常离谱。不存在当前资源句柄,而且AFX_MANAGE_状态也不管理资源的句柄。它管理模块句柄。至于ID的唯一性:每个模块和资源类型的资源ID必须是唯一的。一个模块可以包含具有相同ID的不同类型的资源。使用AFX_MANAGE_STATE时,MFC的当前资源句柄不是被保存和恢复了吗。事实上,当前状态已切换。。。所以行为改变了。这就是我的意思:对于当前资源句柄,您如何将其称为AfxSetResourceHandle设置的?我们不是在谈论MFC吗。这里没有询问资源绑定到模块的基本事实。问题是:什么时候你需要你自己的资源ID,什么时候可以重用一个…@xMRi我们正在使用一系列扩展DLL,每个扩展DLL都是私有资源。在一个dll中,每个类型的ID都是唯一的。xMRi你正好解决了我的问题。一个dll意外地重用了一个被删除的扩展dll已经使用的ID,这会导致上面的另一个扩展dll加载错误的资源。我的解决方案是,正如HansPassant所提到的,我们必须考虑消除过去15年中增长的大量dll链。如果有理由保留更多DLL,我们将重新组织代码,使其成为wehre,这是有意义的,而不是开发人员在添加代码或资源时正在进行的工作,目前这对于许多类来说是随机的。如有必要,我们还将考虑最终DLL链的ID范围。我还发现了一些被重用的资源,用于强制交换特定的资源。我不喜欢隐式重写资源的这个隐藏特性。我们必须重新设计一些东西:谢谢大家的时间和有用的评论。