Ticket #39736

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

Date d'ouverture: 2019-11-09 13:48 Dernière mise à jour: 2019-11-09 17:43

Rapporteur:
Propriétaire:
Type:
État:
Atteints
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Fixed
Fichier:
Aucun

Détails

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

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

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

Ticket History (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
Commentaire

原因

ダイアログに表示する画像を切り替えるとき、直前まで表示していた画像の メモリを開放するため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
Commentaire

対策

MTHowToViewDlg::_Clear

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

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

2019-11-09 13:49 Updated by: yknk
Commentaire

リファクタリング

MTHowToViewDlg::_LoadHowToBmp

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

2019-11-09 17:43 Updated by: yknk
  • Résolution Update from Aucun to Fixed
  • État Update from Ouvert to Atteints

Attachment File List

No attachments

Modifier

Please login to add comment to this ticket » Connexion