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呼び出し時に発生している。
if (m_hMemBmpPixel != NULL) { GlobalUnlock(m_hMemBmpPixel); GlobalFree(m_hMemBmpPixel); ←この処理で例外発生 m_hMemBmpPixel = NULL; }