C++ GDI+;GetHBITMAP内存错误?

C++ GDI+;GetHBITMAP内存错误?,c++,windows,gdi+,C++,Windows,Gdi+,所以我试图学习一些GDI的基础知识,当我试图为我想要显示的png图像获取HBITMAP时,我的代码中断了 HBITMAP SplashScreen::LoadPng(WCHAR* path) { HBITMAP bmp; fstream f; f.open(path); if(!f.good()) { throw std::exception("Can't find/read file."); } f.close(); Gdiplus::Bitmap*

所以我试图学习一些GDI的基础知识,当我试图为我想要显示的png图像获取HBITMAP时,我的代码中断了

HBITMAP SplashScreen::LoadPng(WCHAR* path)
{
  HBITMAP bmp;
  fstream f;
  f.open(path);
  if(!f.good())
  {
    throw std::exception("Can't find/read file.");
  }
  f.close();

  Gdiplus::Bitmap* img = Gdiplus::Bitmap::FromFile(path, FALSE); 
  Gdiplus::Color bg(0,0,0,0); 
  img->GetHBITMAP(bg, &bmp);     // <--- Breaks here! Memory access exception!

  return bmp;
}
HBITMAP SplashScreen::LoadPng(WCHAR*path)
{
HBITMAP-bmp;
fsf;
f、 开放(路径);
如果(!f.good())
{
抛出std::异常(“找不到/读取文件”);
}
f、 close();
Gdiplus::Bitmap*img=Gdiplus::Bitmap::FromFile(路径,FALSE);
彩色bg(0,0,0,0);

img->GetHBITMAP(bg,&bmp);//不确定您的问题是什么,但我注意到您有内存泄漏。
img
绝不是
delete
d-您应该在调用GetHBITMAP后调用
delete img;

我在快速测试项目中使用以下代码(不太彻底的代码)

// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP mLoadImg(WCHAR *szFilename)
{
   HBITMAP result=NULL;

   Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
   bitmap->GetHBITMAP(0, &result);
   delete bitmap;
   return result;
}

我没有正确初始化GDI。在修复我的初始化代码后,它工作正常。这很烦人。现在我知道了。

您的代码缺少必需的错误检查。如果方法失败,img将为null。Kaboom。是什么原因导致它失败…除了错误的路径之外。我知道它是对的。@HansPassant,我调出了文档,但它没有指定它失败时做什么。你确定它为null吗?很可能Gdiplus::Bitmap::FromFile失败,所以
img
为null是的,img为null,但为什么?路径是c正确。另外,img是来自Photoshop的png。谢谢。我想可能是内存泄漏了。哈哈。如果我在返回之前删除了位图,我不确定HBITMAP是否仍然有效。我想答案是肯定的。