ある特定のPNGファイルをLoadGraphで読み込む際に、他の処理を挟んで同じファイルを2回読み込むとLoadGraphの所で「ハンドルされない例外」が出てプログラムが停止してしまいます。
コードは以下のような感じです。
int a_handle;
a_handle = LoadGraph( "PNGファイルaのパス" );
...色々な処理
DeleteGraph( a_handle );
...色々な処理(他の画像ファイルの読み込み等を含む)
a_handle = LoadGraph( "PNGファイルaのパス" ); ←ハンドルされない例外で停止
以下のコードも試してみたのですが、こちらは特に問題は発生しませんでした。
a_handle = LoadGraph( "PNGファイルaのパス" );
DeleteGraph( a_handle );
a_handle = LoadGraph( "PNGファイルaのパス" ); ←問題なし
DeleteGraph( a_handle );
2回連続LoadGraph以外にも、間に挟んでいる処理の内容によっては停止されたり停止されなかったりしました。
また、このファイルを別のPNGファイルに置き換えたり、画像加工ツールで中身を描き替えたりするとこちらも停止されたり停止されなかったりします。
さらに、この例外での停止はVisual c++ 2019の32bitのDebugモードの時だけ発生し、64bitのDebugや、32bitのReleaseモードでは発生しませんでした
なのでまとめると、特定のPNGファイルが1度LoadGraphされた後に、他のなんらかの処理を挟んで再びLoadGraphをすると、32bitのDebugモードの時だけ画像ファイルの中身によって停止されてしまう、ということです。
すごいピンポイントな状況での問題であり、Releaseでは今のところ発生していないので致命的な問題という認識なのですが、一応報告しました。
以下は停止した時のログです。
0:ChangeWindowMode実行
0:ウインドウモードフラグが立てられました
15:ディスプレイ情報のセットアップ開始
15: モニターの数:1 ディスプレイデバイスの数:7
15: No.0 モニター名:\\.\DISPLAY1 1920x1080 32bit 59Hz
46:ディスプレイ情報のセットアップ完了
78:DXライブラリの初期化処理開始
93: システムの情報を出力します
93: DXライブラリ Ver3.23c
93: 論理プロセッサの数 : 4
93: OS Windows11 ( Build 22000 )
97: COMの初期化... 成功
100: 非同期読み込み処理の初期化...成功
101: ファイルアクセス処理の初期化...成功
102: メモリ総量:8028.05MB 空きメモリ領域:899.07MB
105: タイマーの精度を検査します
105: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
106: パフォーマンスカウンターを使用します タイマー精度 : 10000.000000 KHz
106: ソフトの二重起動検査... 二重起動はされていませんでした
114: ウインドウクラスを登録します... 登録に成功しました
116: ウインドウモード起動用のウインドウを作成します
120: ウインドウの作成に成功しました
121: ウインドウを表示します
250: IMEを無効にしました
254: ウインドウスタイルをウインドウモード用に変更します... 完了
295: DirectInput関係初期化処理
296: XInput DLL の読み込み中... 成功
303: DirectInput8 の取得を試みます...成功
322: 引き続き初期化処理... 初期化成功
351: ジョイパッドの初期化...
352: XInput 対応コントローラーのチェックを開始します
353: XInput 対応コントローラー No.0 をチェック
354: XInput 対応コントローラー No.0 の接続は確認できませんでした
355: XInput 対応コントローラー No.1 をチェック
356: XInput 対応コントローラー No.1 の接続は確認できませんでした
356: XInput 対応コントローラー No.2 をチェック
357: XInput 対応コントローラー No.2 の接続は確認できませんでした
358: XInput 対応コントローラー No.3 をチェック
358: XInput 対応コントローラー No.3 の接続は確認できませんでした
359: XInput 対応コントローラーのチェック完了
359: DirectInput 対応ジョイパッドの列挙を開始します
376: DirectInput 対応入力装置を検出しました
382: Device Product GUID : 05c4054c,0000,0000,00,00,50,49,44,56,49,44
382: Device Instance GUID : 260af480,7484,11ec,80,01,44,45,53,54,00,00
383: DirectInputDevice8 の作成... 成功
387: DirectInputDevice の情報を取得します... 成功
389: Device Product Name : Wireless Controller
390: Device Instance Name : Wireless Controller
391: 検出した DirectInput 対応入力装置が Xbox360コントローラーか確認... 不一致
393: 検出した DirectInput 対応入力装置が XboxOneコントローラーか確認... 不一致
395: 検出した DirectInput 対応入力装置が XInput 対応コントローラーか確認... 不一致
942: DirectInputDevice のデータ形式に JOYSTICK 形式を設定... 成功
943: DirectInputDevice の協調レベルに DISCL_FOREGROUND | DISCL_EXCLUSIVE を設定... 成功
944: DirectInputDevice から取得する X軸 の値の範囲を設定... 成功
945: DirectInputDevice から取得する Y軸 の値の範囲を設定... 成功
947: DirectInputDevice から取得する Z軸 の値の範囲を設定... 成功
949: DirectInputDevice から取得する Rx軸 の値の範囲を設定... 成功
950: DirectInputDevice から取得する Ry軸 の値の範囲を設定... 成功
951: DirectInputDevice から取得する Rz軸 の値の範囲を設定... 成功
952: DirectInputDevice のボタンの数を取得... 成功 ボタンの数は 14 個です
953: DirectInputDevice の X軸 のデッドゾーンを設定... 成功
954: DirectInputDevice の Y軸 のデッドゾーンを設定... 成功
956: DirectInputDevice の Z軸 のデッドゾーンを設定... 成功
956: DirectInputDevice の Rx軸 のデッドゾーンを設定... 成功
957: DirectInputDevice の Ry軸 のデッドゾーンを設定... 成功
958: DirectInputDevice の Rz軸 のデッドゾーンを設定... 成功
959: DirectInputDevice の DirectInputEffect No.0 を作成... 失敗 Error Code :0x80004001
959: DirectInputDevice の DirectInputEffect No.1 を作成... 失敗 Error Code :0x80004001
960: DirectInputDevice の通知処理用の Event を作成... 成功
961: DirectInputDevice の通知処理用の Event を DirectInputDevice に設定... 成功
961: DirectInputDevice のアクセス権を取得... 成功
965: 検出した DirectInput 対応入力装置を入力ナンバー 0 で登録します
965: 検出した DirectInput 対応入力装置の初期化は正常に終了しました
965: DirectInput 対応ジョイパッドの列挙終了
965: ジョイパッドの初期化は正常に終了しました
966: マウスデバイスの初期化... 初期化成功
966: キーボードデバイスの初期化... 初期化成功
967: DirectInput 関連の初期化は正常に終了しました
1006: WASAPI の初期化を行います
1021: デバイス名 : ヘッドフォン (Realtek(R) Audio)
1027: デフォルト遅延時間 : 10.000 ms
1028: 最小遅延時間 : 3.000 ms
1028: 遅延時間 : 10.000 ms
1033: チャンネル数 : 2 ch
1033: 量子化ビット深度 : 32 bit
1034: 有効ビット深度 : 32 bit
1034: サンプリングレート : 48000 Hz
1034: データ形式 : 浮動小数点型
1284: 動作モード : 共有モード
1285: WASAPI の初期化は正常に終了しました
1468: d3d11.dll の読み込み.... 成功
1478: dxgi.dll の読み込み.... 成功
1481: API CreateDXGIFactory2 のアドレスを取得します.... 成功
1482: IDXGIFactory2 を作成します.... 成功
1491: IDXGIAdapter を列挙
1491: Adapter No.0 Desc:NVIDIA Quadro P400
1492: Output Device No.0 Name:\\.\DISPLAY1
1493: Adapter No.1 Desc:Intel(R) UHD Graphics 630
1494: Adapter No.2 Desc:Microsoft Basic Render Driver
1494: API D3D11CreateDevice のアドレスを取得します.... 成功
1495: IDXGIAdapter を取得します.... 成功
1496: Direct3D 11 FeatureLevel 11_0 以上を対象とします
1496: ID3D11Device オブジェクトを取得します.... 成功
1609: IDXGIDevice1 を取得します.... 成功
1610: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました
1610: [ウインドウモード 1920x1080]
1610: IDXGISwapChain2 を作成します.... 成功
1612: IDXGIFactory2->CreateSwapChainForHwnd の戻り値:0x00000000
1613: IDXGIOutput を取得します.... 成功
1615: Graphics Device:NVIDIA Quadro P400
1616: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
1616: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です
1617: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です
1618: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です
1618: 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です
1619: 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です
1619: アルファ付き 16bit カラーフォーマットは DXGI_FORMAT_B4G4R4A4_UNORM です
1620: アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
1620: アルファテスト用 16bit カラーフォーマットは DXGI_FORMAT_B5G5R5A1_UNORM です
1620: アルファテスト用 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
1620: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です
1621: DXT2テクスチャフォーマットは使えません
1621: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です
1621: DXT4テクスチャフォーマットは使えません
1621: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です
1622: BC7_UNORM テクスチャフォーマットは DXGI_FORMAT_BC7_UNORM です
1622: BC7_UNORM_SRGB テクスチャフォーマットは DXGI_FORMAT_BC7_UNORM_SRGB です
1622: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です
1622: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です
1623: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です
1623: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です
1623: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です
1624: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です
1624: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です
1624: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です
1624: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です
1625: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です
1625: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です
1625: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です
1625: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です
1626: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
1626: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です
1626: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です
1627: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です
1627: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です
1627: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です
1627: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です
1627: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です
1628: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です
1628: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です
1628: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です
1628: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です
1628: 使用する機能レベル:D3D_FEATURE_LEVEL_11_1
1629: 同時にレンダリングできるバッファの数:8
1629: 最大テクスチャサイズ 幅:16384 高さ:16384
1629: 標準描画用の頂点バッファの作成.... 成功
1630: シェーダーコード関係の初期化.... 成功
1721: 各種シェーダー用定数バッファの作成.... 成功
1724: 各種 ID3D11InputLayout の作成.... 成功
1751: 画像の単純転送処理の初期化... 成功
1753: 深度バッファを作成します.... 成功
1804: フォントの初期化を行います
1809: フォントの初期化は正常に終了しました
1890: 文字コードバッファの初期化を行います... 完了しました
1977:DXライブラリの初期化処理終了
また、停止した時の呼び出し履歴も張っておきます。
一番上が直近です。
LoadPngImage_Fast(struct DxLib::tagSTREAMDATA *,struct DxLib::tagBASEIMAGE *,int) C++
DxLib::CreateGraphImageType2_UseGParam(struct DxLib::CREATEBASEIMAGETYPE2_GPARAM *,struct DxLib::tagSTREAMDATA *,struct DxLib::tagBASEIMAGE *) C++
DxLib::CreateGraphImageOrDIBGraph_UseGParam(struct DxLib::LOADBASEIMAGE_GPARAM *,wchar_t const *,void const *,int,int,int,int,int,struct DxLib::tagBASEIMAGE *,struct tagBITMAPINFO * *,void * *) C++
DxLib::CreateGraphImage_plus_Alpha_UseGParam(struct DxLib::LOADBASEIMAGE_GPARAM *,wchar_t const *,void const *,int,int,void const *,int,int,struct DxLib::tagBASEIMAGE *,struct DxLib::tagBASEIMAGE *,int,int) C++
DxLib::Graphics_Image_CreateGraphFromMem_UseGParam(struct DxLib::LOADGRAPH_GPARAM *,int,int,void const *,int,void const *,int,int,int,int) C++
DxLib::Graphics_Image_CreateGraphFromMem_UseGParam(struct DxLib::LOADGRAPH_GPARAM *,int,int,void const *,int,void const *,int,int,int,int) C++
DxLib::Graphics_Image_CreateGraph_UseGParam(struct DxLib::LOADGRAPH_PARAM *,int,int) C++
DxLib::LoadBmpToGraph_WCHAR_T(wchar_t const *,int,int,int) C++
DxLib::LoadBmpToGraph(char const *,int,int,int) C++
DxLib::LoadGraph(char const *,int) C++