我正在处理一个包含位图资源的DLL。我通过Visual中的资源视图导入了该位图。DLL还导出一个类,该类具有尝试加载位图的函数:
BOOL CMyExportedClass::Create(CWnd* pParentWnd /*= NULL*/)
{
if (!m_bitmap.LoadBitmap(IDB_BITMAP1))
return FALSE;
// ...
}从MFC应用程序加载DLL。然后在应用程序InitInstance()函数中调用DLL的导出函数,该函数最终调用CMyExportedClass::Create()。
但是,LoadBitmap()总是返回0,根据文档表示内存不足(不是情况)或资源不存在。
位图文件是我的DLL项目的一部分,IDB_BITMAP1是在.rc文件和Resoure.h中定义的
MyDLL.rc:
IDB_BITMAP1 BITMAP "res\\mybitmap.bmp"Resourcee.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()函数在这里有什么区别呢?
发布于 2014-04-08 11:04:12
最有可能的解释是,进程中的其他模块有一个具有该ID的资源,而搜索该资源的MFC代码正在另一个模块中查找调用LoadBitmap的模块。
我的建议是使用LoadImage并对搜索哪个模块的资源进行精确控制。
发布于 2014-11-12 15:30:58
实际上,不执行搜索。MFC根据文档从可执行文件而不是dll加载位图:
从应用程序的lpszResourceName可执行文件加载由nIDResource中的ID号命名或标识的位图资源。
编辑(以完成回答):
相反,可以使用这个(或者像您所做的那样使用LoadImage() ):
m_bitmap.Attach(::LoadBitmap(hCurrentModule, MAKEINTRESOURCE(IDB_BITMAP1)));https://stackoverflow.com/questions/22934040
复制相似问题