【发布时间】: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