资源ID在我的共享MFC DLL中是否唯一

时间:2015-05-23 12:11:10

标签: visual-c++ mfc

示例:第一个MFC DLL在resource.h中有一个ID值为4711的菜单ID_MENU_FOO。第二个MFC DLL还有另一个具有相同ID值4711的菜单ID_MENU_BAR。 Application(exe)使用DLL并调用LoadMenu。如果我想验证要加载的所需菜单,我需要调用API方法LoadMenu,为所需的dll提供模块句柄。或者我错了吗?

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

Hans Passant给出了答案

  

跨模块使用资源不是“最佳实践”。正确分区您的代码,窗口使用一个菜单,所以只需确保所有窗口的实现细节都在同一个模块中。

答案 1 :(得分:0)

这取决于您拥有的模块类型。加载资源需要一个句柄从哪里加载它。

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

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

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

我忘了说:如果你使用MFC作为共享DLL,这一切都很重要。否则每个模块都有自己的资源句柄......

可以通过其他方式共享资源。你可能有自己的Loader例程来获取它们......