任务单 #39736

Win版 x64デバッグ構成のときHow to viewダイアログで例外発生

开放日期: 2019-11-09 13:48 最后更新: 2019-11-09 17:43

报告人:
属主:
类型:
状态:
关闭
优先:
5 - Medium
严重性:
5 - Medium
处理结果:
Fixed
文件:

Details

x64デバッグ構成でMIDITrailをビルドして起動し、How to viewダイアログを表示すると、 Nextボタンを押したときに例外が発生する。

例外はMTHowToViewDlg::_ClearでGlobalFree呼び出し時に発生している。

	if (m_hMemBmpPixel != NULL) {
		GlobalUnlock(m_hMemBmpPixel);
		GlobalFree(m_hMemBmpPixel); ←この処理で例外発生
		m_hMemBmpPixel = NULL;
	}

任务单历史 (3/5 Histories)

2019-11-09 13:48 Updated by: yknk
  • New Ticket "Win版 x64デバッグ構成のときHow to viewダイアログで例外発生" created
2019-11-09 13:49 Updated by: yknk
评论

原因

ダイアログに表示する画像を切り替えるとき、直前まで表示していた画像の メモリを開放するため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;
	}
(以下略)
2019-11-09 13:49 Updated by: yknk
评论

対策

MTHowToViewDlg::_Clear

適正なサイズでメンバ変数の構造体をゼロクリアする。

変更前:ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFO));
変更後:ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFOHEADER));

2019-11-09 13:49 Updated by: yknk
评论

リファクタリング

MTHowToViewDlg::_LoadHowToBmp

コメントを改善する。 BMPピクセルデータ読み込み処理において、ファイル読み取りサイズに 画像ファイルサイズではなく、BMPピクセルデータのサイズを指定する。

2019-11-09 17:43 Updated by: yknk
  • 处理结果 Update from to Fixed
  • 状态 Update from 开启 to 关闭

Attachment File List

No attachments

编辑

Please login to add comment to this ticket » 登录名