トップページ > 過去ログ > 記事閲覧
SetChangeScreenModeGraphicsSys
名前:na 日時: 2011/01/09 13:38

SetChangeScreenModeGraphicsSystemResetFlagにFALSEを設定して LoadDivGraphで画像を読み込んで ChangeWindowModeを呼ぶと強制終了します。 開始:フルスクリーン 問題なし ↓ Sキー押下:ウィンドウ (出力ウィンドウにtest.exe の 0x773ffbae で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0068f54c)。) ↓ Aキー押下:出力ウィンドウに Critical error detected c0000374 Windows によって test.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。test.exe または読み込まれた DLL にバグがあります。 あるいは、test.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。 プログラム '[2712] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 画像サイズ tama00.png 56x8 tama01.png 112x16 DxLib ver3.04d Windows Vista VC++2010Express よろしくお願いします。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(FALSE); DxLib_Init(); SetChangeScreenModeGraphicsSystemResetFlag(FALSE); SetDrawScreen(DX_SCREEN_BACK); int GrHandle[2][7]; LoadDivGraph("tama00.png", 7, 7, 1, 8, 8, &GrHandle[0][0]); LoadDivGraph("tama01.png", 7, 7, 1, 16, 16, &GrHandle[1][0]); char key[256]; char keyCnt[256]; int i; while (!ProcessMessage()) { ClearDrawScreen(); GetHitKeyStateAll(key); for (i = 0; i < 256; i ++) { if (key[i] == 0) { keyCnt[i] = 0; } else { keyCnt[i]++; } } DrawFormatString(0, 0, GetColor(255, 255, 255), "A[%d] S[%d]", keyCnt[KEY_INPUT_A], keyCnt[KEY_INPUT_S]); if (keyCnt[KEY_INPUT_A] == 1) { ChangeWindowMode(FALSE); } if (keyCnt[KEY_INPUT_S] == 1) { ChangeWindowMode(TRUE); } if (keyCnt[KEY_INPUT_ESCAPE] == 1) { break; } for (i = 0; i < 7; i++) { DrawGraph( 8 * i, 30, GrHandle[0][i], FALSE); DrawGraph(16 * i, 50, GrHandle[1][i], TRUE); } ScreenFlip(); } DxLib_End(); return 0; }

Page: 1 |

Re: SetChangeScreenModeGraphicsSys ( No.1 )
名前:いっち 日時:2011/01/09 15:36

事象確認しました。 > Sキー押下:ウィンドウ > (出力ウィンドウにtest.exe の 0x773ffbae で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0068f54c)。) これはDrawFormatString内部で発生している模様です。(DrawStringでも確認) フルスクリーンとウィンドウモードの切り替えによる強制終了については、 普通の LoadGraph では発生しない(しにくい?)ようですが LoadDivGraph や DerivationGraph を使って原点(0,0)以外から切り出して グラフィックハンドルを作成した場合に再現するようでした。 DXライブラリのバグだと思うので管理人さんの見解をお待ちするのが宜しいと思います。
Re: SetChangeScreenModeGraphicsSys ( No.2 )
名前:管理人 日時:2011/01/10 22:09

ご報告ありがとうございます 私の環境では強制終了が起きなかったので完全に直せたかどうかは分かりませんが、 少なくとも > test.exe の 0x773ffbae で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0068f54c) の出力の原因となっているバグは修正しましたので、多分・・・直ったと思います (・・; よろしければこちらをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) > いっちさん 再現テストありがとうございます エラーログと強制終了は別物・・・ではないことを祈ります (・・;;
Re: SetChangeScreenModeGraphicsSys ( No.3 )
名前:na 日時:2011/01/11 01:04

いっちさん、管理人さんありがとうございます。 > test.exe の 0x773ffbae で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0068f54c) は出なくなりました。 が、強制終了は起こります。 OutputDebugString付けました。 if (keyCnt[KEY_INPUT_A] == 1) { OutputDebugString("Aキー押下\n"); ChangeWindowMode(FALSE); } if (keyCnt[KEY_INPUT_S] == 1) { OutputDebugString("Sキー押下\n"); ChangeWindowMode(TRUE); } 出力ウィンドウ 0:システムの情報を出力します 16: DXライブラリ Ver3.04e 16: 論理プロセッサの数 : 1 16: OS WindowsVista ( Build 6002 Service Pack 2 ) 125: CPU動作速度:大体1.69GHz 131: MMX命令を使用します 139: SSE命令が使用可能です 143: SSE2命令が使用可能です 148: CPUベンダ:GenuineIntel 169: CPU名:Intel(R) Celeron(R) M CPU 430 @ 1.73GHz 189:COMの初期化... 成功しました 205:メモリ総量:1469.39MB 空きメモリ領域:457.26MB 457.26MB 211:タイマーの精度を検査します 218:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 222: パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz 228: ソフトの二重起動検査... 二重起動はされていませんでした 240:ウインドウクラスを登録します... 登録に成功しました 249:フルスクリーンモード用のウインドウを作成します 253:ウインドウの作成に成功しました 268:カーソルを不可視にしました 292:IMEを無効にしました 296:DirectInput関係初期化処理 299: DirectInput7 の取得中... 成功 473: 引き続き初期化処理... 初期化成功 677: ジョイパッドの初期化... 696: ジョイパッドの初期化は正常に終了しました 705: マウスデバイスの初期化... 初期化成功 713: キーボードデバイスの初期化... 初期化成功 724:DirectInput 関連の初期化は正常に終了しました 731:DirectSound の初期化を行います 734:DirectSound インターフェースの取得を行います.... 成功 764:引き続きインターフェースの初期化処理... 成功 945: DirectSound デバイスを列挙します 950: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 955: モジュール名:{0.0.0.00000000}.{49fa7a07-6fcd-4588-87d7-cc25176f87c0} ドライバ記述:スピーカー (High Definition Audio デバイス) 960: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 969: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 974: 利用可能サンプリング精度 978: プライマリ 16bit = OK 8bit = OK 982: セカンダリ 16bit = OK 8bit = OK 987: 利用可能チャンネル 991: プライマリ MONO = OK STEREO = OK 996: セカンダリ MONO = OK STEREO = OK 1003:DirectSound の初期化は正常に終了しました 1029:DirectDraw オブジェクトの取得を行います.... 成功 1058:引き続き初期化処理... 初期化に成功しました 1166:IDirect3D9Ex オブジェクトを取得します.... 成功 1186:Desktop Window Manager を無効にしました 1215:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 3183:成功 3325:Driver:atiumdag.dll Description:RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) 3326:画面のフォーマットは D3DFMT_R5G6B5 です 3328:Zバッファのフォーマットは D3DFMT_D16 です 3329:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 3330:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 3332:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 3333:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 3334:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 3336:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 3337:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 3413:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 3414:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 3415:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 3417:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 3418:描画用 16bit カラーフォーマットは D3DFMT_R5G6B5 です 3420:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 3421:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 3423:最大テクスチャサイズ 幅:2048 高さ:2048 3424:テクスチャステージテンポラリレジスタ:使用可 3425:減算合成のハードウェア対応:ネイティブ 3491:頂点シェーダーバージョンコード:200 3492:ピクセルシェーダーバージョンコード:200 3563:バックバッファロック転送の時間:14402nsec 一時的な描画可能バッファを使用した転送の時間:11175nsec 3565:バックバッファロックを使用しません 3566:Zバッファを作成します.... 成功 3627:プログラマブルシェーダーを使用します 4359:フォントの初期化を行います 4371:フォントの初期化は正常に終了しました 4373:文字コードバッファの初期化を行います... 完了しました Sキー押下 7802:ChangeWindowMode実行 7805:ウインドウモードフラグが立てられました 7807:ウインドウスタイルをウインドウモード用に変更します... 完了 7843:画面モード変更処理を開始します 9755: DirectDraw オブジェクトの取得を行います.... 成功 9758: 引き続き初期化処理... 初期化に成功しました 9838: IDirect3D9Ex オブジェクトを取得します.... 成功 10474: IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 12321: 成功 12325: Driver:atiumdag.dll Description:RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) 12327: 画面のフォーマットは D3DFMT_X8R8G8B8 です 12328: Zバッファのフォーマットは D3DFMT_D16 です 12330: 16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 12332: 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 12336: アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 12338: アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 12340: アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 12341: アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 12354: DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 12356: DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 12358: DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 12362: DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 12364: DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 12365: 描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 12368: 描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 12369: 描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 12371: 最大テクスチャサイズ 幅:2048 高さ:2048 12373: テクスチャステージテンポラリレジスタ:使用可 12376: 減算合成のハードウェア対応:ネイティブ 12378: 頂点シェーダーバージョンコード:200 12380: ピクセルシェーダーバージョンコード:200 12501: バックバッファロック転送の時間:23485nsec 一時的な描画可能バッファを使用した転送の時間:9767nsec 12507: バックバッファロックを使用しません 12511: Zバッファを作成します.... 成功 12523: プログラマブルシェーダーを使用します 12782: グラフィックを復帰します 12812: ウインドウスタイルをウインドウモード用に変更します... 完了 12820:画面モード変更処理は正常に終了しました Aキー押下 50141:ChangeWindowMode実行 50172:ウインドウモードフラグが倒されました 50177:ウインドウスタイルをフルスクリーンモード用に変更します... 完了 50190:画面モード変更処理を開始します Critical error detected c0000374 Windows によって test.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。test.exe または読み込まれた DLL にバグがあります。 あるいは、test.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。 プログラム '[5196] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。
Re: SetChangeScreenModeGraphicsSys ( No.4 )
名前:いっち 日時:2011/01/11 23:44

DrawFormatString 内部で発生していたであろう例外は発生しなくなりましたが、 ChangeWindowMode 時に強制終了する事象はまだ発生します。 私のほうでももう少し詳しく見てみますので、少々お時間をください。
Re: SetChangeScreenModeGraphicsSys ( No.5 )
名前:いっち 日時:2011/01/14 22:19

naさん> naさんにお聞きしたいのですが、開発ツールは何をご使用でしょうか? また、本事象はデバッガ上での実行以外(普通にexeをダブルクリックで実行等)で発生しますでしょうか? ※追記 私の環境ではデバッガ上での実行でしか発生しないようです。
Re: SetChangeScreenModeGraphicsSys ( No.6 )
名前:na 日時:2011/01/14 22:33

いっちさん 開発ツールはVC++2010Expressです。 exeをダブルクリックで実行 開始:フルスクリーン ↓ Sキー押下:ウィンドウ tama01.pngが描画されない ↓ Aキー押下:フルスクリーン tama01.pngが描画される ↓ Sキー押下 10秒程固まって、勝手に終了します。
Re: SetChangeScreenModeGraphicsSys ( No.7 )
名前:いっち 日時:2011/01/15 19:59

遅くなってすみません。 私の環境ではデバッガ上でしか発生しませんので、naさんの環境で発生している事象とは異なるかもしれませんが、 テストコードにDXライブラリのソースを取り込んでビルドしたものを実行し、どこでブレークが発生しているかチェックしてみました。 テスト結果のスクリーンショットやログをまとめたものです。 > ://www1.axfc.net/uploader/He/so/309065.zip&key=dxlib 結果としては、ブレークが発生するポイントが4パターンほど存在しました。 (まとめた結果はパターンごとにフォルダわけしています) 中でもパターン2とパターン4の発生率が高かったです。 パターン3はかなり奇妙な事象で本件とは関係ないような気がします。 ただし、テスト結果について注意点が3点ほどあります。 ・naさんの環境と発生条件が違う。 ・ブレークポイントの発生したソースを表示する際になぜか 「ソース ファイルがモジュールがビルドされたときのものと異なります。デバッガでこのファイルを使用しますか?」 といったエラーが出ていたのでもしかすると正確な位置では無いかもしれません。 ・私のテスト環境はお世辞にもクリーンと言えないので、そもそもあまり参考にならない。 このような結果でお役に立てるかどうか分かりませんが、もし必要なテストや情報があればご指示下さい。 私の個人的な見解としては、OSとかドライバとかDirectXやなんかをインストールしなおしたら直らないかなぁという感じです。 でなければ複数のポイントでブレークが発生しているのでマルチスレッドがらみだと思うのですが・・・。 以下はテストに使用したコードをプロジェクトごとまとめたものです。 > ://www1.axfc.net/uploader/H/so/124642.zip&key=dxlib (基本的にコードはこのままですが ChangeWindowMode( TRUE ); のコメントは ON/OFF しながらテストしていました。) naさん> 上記のプロジェクトを利用して、デバッガ上で実行した際にどこでブレークが発生するか調べて頂くことは可能でしょうか? 重要なのはおそらく呼び出し履歴です(ウィンドウ内を右クリックでテキストコピーできると思います)。
Re: SetChangeScreenModeGraphicsSys ( No.8 )
名前:管理人 日時:2011/01/15 21:26

ご情報ありがとうございます 先に Dixqさんからご報告頂いたバグを修正していたのですが、そのバグの原因が フルスクリーン→アクティブなプロセスの変更によるデスクトップ画面への変更→フルスクリーン などの操作で発生する「デスクトップ画面への変更で消失したグラフィックス情報の復帰処理」時に 発生していることから、こちらの不具合と同じ原因のような気がしてきました ( SetChangeScreenModeGraphicsSystemResetFlag はこの機能を意図的な画面モード変更時に使用するための機能 ) 現時点で既にいっちさんのご報告にありますパターン1のバグは修正できていると思いますので、 ( パターン2とパターン4も同じ原因である確率が高いと思います ) よろしければこちらの修正バージョンをお試しになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: SetChangeScreenModeGraphicsSys ( No.9 )
名前:いっち 日時:2011/01/15 22:43

軽くテストして見ましたが、修正できているように見受けられます。 対応お疲れ様でした。

Page: 1 |