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

Should Resource IDs be unique in my shared MFC DLLs

示例:第一个 MFC DLL 在 resource.h 中有一个菜单 ID_MENU_FOO,其 ID 值为 4711。第二个 MFC DLL 也有另一个菜单 ID_MENU_BAR 具有相同的 ID 值 4711。 应用程序 (exe) 使用 DLL 和调用 LoadMenu. If I want to verify the desired menu to be loaded, I need to call the API method LoadMenu 为所需的 dll 提供模块句柄。还是我错了?

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

提前致谢!

Hans Passant给出了答案

Using resources across modules is not a "best practice". Partition your code properly, a menu is used by a window so just make sure that all of the window's implementation details are in the same module.

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

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

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

所以这取决于你有什么以及你想如何设计你的程序。因为我有一堆扩展 DLL,所以我有特定范围用于每个模块中的 ID。在不触及现有扩展 DLL 范围的情况下,对它们自己进行标准维护,因为它们在标准 DLL 搜索路径中也可用。

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

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