Win版 x64デバッグ構成のときHow to viewダイアログで例外発生
ダイアログに表示する画像を切り替えるとき、直前まで表示していた画像の メモリを開放するためGlobalFreeを実行している。
この処理の直前で、メンバ変数m_BmpInfoの構造体をゼロクリアしていたが、 m_BmpInfoはBITMAPINFOHEADER構造体であるにも関わらず、それよりもサイズが 大きいBITMAPINFO構造体のサイズでゼロクリアしていた。
構造体のサイズを超えてゼロクリアしていたため、メモリ破壊を引き起こしていた。 これにより直後のGlobalFreeで例外が発生した。
void MTHowToViewDlg::_Clear() { ZeroMemory(&m_BmpHead, sizeof(BITMAPFILEHEADER)); ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFO)); ←この処理でメモリ破壊発生 if (m_hMemBmpPixel != NULL) { GlobalUnlock(m_hMemBmpPixel); GlobalFree(m_hMemBmpPixel); ←この処理で例外発生 m_hMemBmpPixel = NULL; } (以下略)
適正なサイズでメンバ変数の構造体をゼロクリアする。
変更前:ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFO)); 変更後:ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFOHEADER));
コメントを改善する。 BMPピクセルデータ読み込み処理において、ファイル読み取りサイズに 画像ファイルサイズではなく、BMPピクセルデータのサイズを指定する。
x64デバッグ構成でMIDITrailをビルドして起動し、How to viewダイアログを表示すると、 Nextボタンを押したときに例外が発生する。
例外はMTHowToViewDlg::_ClearでGlobalFree呼び出し時に発生している。