WTL强制资源从非mfc应用程序中的dll加载的方式? (我们使用的是 WTL/ATL,不是直接的 win32)
Posted
技术标签:
【中文标题】WTL强制资源从非mfc应用程序中的dll加载的方式? (我们使用的是 WTL/ATL,不是直接的 win32)【英文标题】:WTL way of forcing resources to load from a dll in a non mfc app? (we are using WTL/ATL, not straight win32) 【发布时间】:2011-07-17 13:04:03 【问题描述】:我之前发布了this question,现在已加载本地化字符串(我们使用 LoadString() 获得的字符串),但我还需要从附属 DLL 加载所有其他资源。
MFC 有 AfxSetResourceHandle () 调用,但我需要与非 mfc 应用程序等效的东西吗?我怀疑我必须在某个地方的初始化代码中设置它,以便我的所有资源都从另一个 DLL 加载。如何在 WTL(Windows 模板库)上下文中做到这一点?
编辑:
This summarizes our problem.
我们不是直接使用win32,而是使用ATL 和WTL 来处理windows 的东西。所以我们不能依赖 MFC 的东西,也不能对菜单和对话框资源的加载进行低级控制。
编辑: 嗯…… This seems to have an answer,但我希望有比这更好的东西。例如 - SetResourceInstance() 方法类似于 CAppModule 对象中的 GetResourceInstance()。
【问题讨论】:
【参考方案1】:资源函数(FindResource、LoadResource)将模块句柄作为参数之一。
使用GetModuleHandleEx
获取 DLL 的模块句柄。
编辑: ATL/WTL 的附加信息。
WTL 在其 Win32 调用中使用ATL::_AtlBaseModule.GetResourceInstance()
作为模块句柄。您可以调用 SetResourceInstance
函数来更改使用的模块。像这样的东西应该在你的程序开始时起作用:
HMODULE hmod;
::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, myDllFuncPtr, &hmod);
ATL::_AtlBaseModule.SetResourceInstance(hmod);
【讨论】:
非常好 - 这正是我想要的。【参考方案2】:有时上述方法不可用,例如当您由于某种原因仍需要支持 Windows 2000 时。在这种情况下,最好掌握以下技巧。
我们声明一个静态变量,这意味着它的地址将在它所链接的模块内。然后我们使用该变量的地址来查询该分配区域的基地址,这就是HMODULE
。
HMODULE GetCurrentModuleHandle()
MEMORY_BASIC_INFORMATION mbi;
static int iDummy;
VirtualQuery(&iDummy, &mbi, sizeof(mbi));
return (HMODULE)mbi.AllocationBase;
这绝不会使马克的回答无效!如果您需要程序在古老的系统上运行,请记住它作为备用选项。
【讨论】:
这其实和问题无关,就是告诉WTL基类使用特定模块和资源(SetResourceInstance
)。以上是关于WTL强制资源从非mfc应用程序中的dll加载的方式? (我们使用的是 WTL/ATL,不是直接的 win32)的主要内容,如果未能解决你的问题,请参考以下文章