GDI+ 對象釋放崩潰的問題
確保在Gdiplus::GdiplusShutdown(m_gdiplusToken); 之前delete 掉GDI+的對象,例如:delete *pBitmap;
如果先Gdiplus::GdiplusShutdown(m_gdiplusToken);再delete *pBitmap; 程序會崩潰。
有時候會為了方便誤將Gdiplus::GdiplusShutdown(m_gdiplusToken)先釋放了,為了確保這種情況在MFC中盡量按下面方式釋放:
int CXXXApp:: ExitInitInstance()
{
GdiplusShutdown(m_GdiplusToken);
return CWinApp:: ExitInstance();
}
在WTL中釋放:
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
HRESULT hRes = ::CoInitialize(NULL);
// HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
ATLASSERT(SUCCEEDED(hRes));
Gdiplus::GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
::DefWindowProc(NULL, 0, 0, 0L);
AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls
hRes = _Module.Init(NULL, hInstance);
ATLASSERT(SUCCEEDED(hRes));
int nRet = Run(lpstrCmdLine, nCmdShow);
_Module.Term();
::CoUninitialize();
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return nRet;
}

浙公網安備 33010602011771號