【问题标题】:CBitmap::LoadBitmap() refuses to load a resourceCBitmap::LoadBitmap() 拒绝加载资源
【发布时间】:2014-05-20 23:20:12
【问题描述】:

我正在处理一个包含位图资源的 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()时,DLLsInitiInstance()函数已经成功返回。

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() 函数有什么区别?

【问题讨论】:

  • 一种可能性是您的主机可执行文件中有一个具有该 ID 的资源。如果是这样,LoadBitmap 将尝试加载该资源而不是 DLL 中的位图。我个人倾向于使用LoadImage
  • @David Heffernan:确实有这样的 ID,但即使在为我的资源分配了唯一 ID 之后,问题仍然存在。
  • 当您尝试 LoadImage 传递 DLL 的模块句柄时会发生什么?
  • @David Heffernan:工作!!但为什么?提前编辑...

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


【解决方案1】:

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

我的建议是使用LoadImage,以便精确控制搜索模块的资源。

【讨论】:

  • 您能否详细说明LoadImageCBitmap::LoadBitmap 的不同之处?毕竟我给出了相同的输入,因此LoadImage 也必须通过其 ID 找到资源。为什么在LoadBitmap 失败的地方它会成功?难道LoadBitmap在内部使用了错误的模块句柄(即GetModuleHandle(NULL))?
  • 这是我的假设。最终CBitmap::LoadBitmap 将调用LoadImage。重要的是传递的模块句柄。通过直接调用LoadImage,您可以对该模块句柄进行外部控制,而不受MFC 的异想天开的影响。
【解决方案2】:

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

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

编辑(完成答案):

改为使用这个(或LoadImage(),就像你所做的那样):

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

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2013-08-26
    • 2011-02-15
    • 2013-08-02
    • 2017-06-18
    • 2011-01-06
    • 2013-12-08
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多