示例:第一个MFC DLL在resource.h中有一个ID值为4711的菜单ID_MENU_FOO。第二个MFC DLL还有另一个具有相同ID值4711的菜单ID_MENU_BAR。 Application(exe)使用DLL并调用LoadMenu。如果我想验证要加载的所需菜单,我需要调用API方法LoadMenu,为所需的dll提供模块句柄。或者我错了吗?
在我自己的项目中处理资源ID及其唯一性的最佳做法是什么?
提前致谢!
答案 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例程来获取它们......