3

我之前发布了这个问题,现在加载了本地化字符串(我们使用 LoadString() 获得的字符串),但我还需要从附属 DLL 加载所有其他资源。

MFC 有 AfxSetResourceHandle () 调用,但我需要非 mfc 应用程序等效的东西吗?我怀疑我必须在某个地方的初始化代码中设置它,以便我的所有资源都从另一个 DLL 加载。我如何在 WTL(Windows 模板库)上下文中做到这一点?

编辑:

这总结了我们的问题

我们不是直接使用win32,而是使用ATL和WTL来处理windows的东西。所以我们不能依赖 MFC 的东西,也不能对菜单和对话框资源的加载进行低级控制。

编辑:嗯...... 这似乎有一个答案,但我希望有比这更好的东西。例如 - 与 CAppModule 对象中的 GetResourceInstance() 类似的 SetResourceInstance() 方法。

4

2 回答 2

6

资源函数(FindResource、LoadResource)将模块句柄作为参数之一。

用于GetModuleHandleEx获取 DLL 的模块句柄。

编辑: ATL/WTL 的附加信息。

WTLATL::_AtlBaseModule.GetResourceInstance()在其 Win32 调用中用于模块句柄。您可以调用一个SetResourceInstance函数来更改使用的模块。像这样的东西应该在你的程序开始时起作用:

HMODULE hmod;
::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, myDllFuncPtr, &hmod);
ATL::_AtlBaseModule.SetResourceInstance(hmod);
于 2011-03-17T16:17:19.743 回答
0

有时上述方法不可用,例如当您由于某种原因仍需要支持 Windows 2000 时。在这种情况下,最好有以下技巧。

我们声明一个静态变量,这意味着它的地址将在它所链接的模块内。然后我们使用该变量的地址来查询该分配区域的基地址,这就是HMODULE它。

HMODULE GetCurrentModuleHandle()
{
    MEMORY_BASIC_INFORMATION mbi;
    static int iDummy;
    VirtualQuery(&iDummy, &mbi, sizeof(mbi));
    return (HMODULE)mbi.AllocationBase;
}

这绝不会使马克的答案无效!如果您需要程序在古老的系统上运行,请记住它作为后备选项。

于 2014-10-14T09:49:31.930 回答