我正在处理一个包含位图资源的DLL。我通过Visual Studio中的资源视图导入了该位图。 DLL还导出一个类,该类具有尝试加载位图的函数:
BOOL CMyExportedClass::Create(CWnd* pParentWnd /*= NULL*/)
{
if (!m_bitmap.LoadBitmap(IDB_BITMAP1))
return FALSE;
// ...
}
从MFC应用程序我加载DLL。在应用程序InitInstance()
函数内部,我然后调用DLL的导出函数,最终调用CMyExportedClass::Create()
。
但是,LoadBitmap()
始终返回0
,根据documentation表示内存不足(不是这种情况)或资源不存在。
位图文件是我的DLL项目的一部分,IDB_BITMAP1
在 .rc 文件以及 resource.h 中定义:
MyDLL.rc:
IDB_BITMAP1 BITMAP "res\\mybitmap.bmp"
resource.h中:
#define IDB_BITMAP1 1034
我已经检查过ID只定义了一次。 FWIW:在调用LoadBitmap()
时,DLL InitiInstance()
函数已成功返回。
LoadBitmap()
拒绝加载资源的原因可能是什么?如何解决此问题?
<小时/> 修改
m_bitmap.LoadBitmap(IDB_BITMAP1)
我执行以下操作:
HBITMAP hBitmap = (HBITMAP)LoadImage(hCurrentModule, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, 0);
if(hBitmap)
m_bitmap.Attach((HBITMAP)hBitmap);
那么CBitmap::LoadBitmap()
和LoadImage()
功能之间的区别是什么?
答案 0 :(得分:2)
最可能的解释是,流程中的某些其他模块具有该ID的资源。搜索资源的MFC代码在另一个模块中查找调用LoadBitmap
的模块。
我的建议是使用LoadImage
,因此可以精确控制搜索哪些模块的资源。
答案 1 :(得分:1)
实际上,没有进行搜索。 MFC根据文档从可执行文件而不是dll加载位图:
加载由lpszResourceName命名或由其标识的位图资源 来自应用程序的可执行文件的nIDResource中的ID号 文件
编辑(完成答案):
而是使用它(或LoadImage()
,如你所做的那样):
m_bitmap.Attach(::LoadBitmap(hCurrentModule, MAKEINTRESOURCE(IDB_BITMAP1)));