CBitmap :: LoadBitmap()拒绝加载资源

时间:2014-04-08 10:17:44

标签: c++ windows visual-studio dll mfc

我正在处理一个包含位图资源的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()功能之间的区别是什么?

2 个答案:

答案 0 :(得分:2)

最可能的解释是,流程中的某些其他模块具有该ID的资源。搜索资源的MFC代码在另一个模块中查找调用LoadBitmap的模块。

我的建议是使用LoadImage,因此可以精确控制搜索哪些模块的资源。

答案 1 :(得分:1)

实际上,没有进行搜索。 MFC根据文档从可执行文件而不是dll加载位图:

  

加载由lpszResourceName命名或由其标识的位图资源   来自应用程序的可执行文件的nIDResource中的ID号   文件

编辑(完成答案):

而是使用它(或LoadImage(),如你所做的那样):

m_bitmap.Attach(::LoadBitmap(hCurrentModule, MAKEINTRESOURCE(IDB_BITMAP1)));