トップページ > 過去ログ > 記事閲覧
DXライブラリの再起動について
名前:Agate 日時: 2010/11/24 01:05

DXライブラリの再起動、 主にProcessMessage関数とDxLib_End関数、DxLib_Init関数についての質問です。 Windows Vista以前のOSでは、DxLib_End関数を用いて、一度DXライブラリを終了した後、 再度DxLib_Init関数を用いて起動しなおすことが可能だったのですが、 Windows 7環境になってから多くの環境において再起動後にProcessMessage関数が-1を返り値として返す現象が発生するようになりました。 作成していたのは、DXライブラリを用いて製作したゲームを起動するためのグラフィカルなランチャーアプリケーションで、 以下のようなプログラムでゲームを起動しています。 (前略) while( ProcessMessage() == 0 ){ (中略) // 各種座標の移動 (中略) // 各種当たり判定 (中略) InitGraph(); InitFontToHandle(); DxLib_End(); STARTUPINFO si; PROCESS_INFORMATION pi; int ret; ZeroMemory( &si, sizeof( si ) ); ZeroMemory( &pi, sizeof( pi ) ); si.cb = sizeof( si ); SetCurrentDirectory( "game" ); ret = CreateProcess( "game.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); WaitForSingleObject( pi.hProcess, INFINITE); CloseHandle( pi.hProcess); CloseHandle( pi.hThread ); SetCurrentDirectory( "..\\" ); DxLib_Init(); (中略) // グラフィックの描画 (中略) } (後略) 複数のPCで動作検証を行いましたが、ProcessMessage関数が-1を出す環境とそうでない環境の差はわかりませんでした。 ただ、わかったことは上記のプログラムでProcessMessage関数が必ず0を返す環境と、 ほぼ-1を返し、極稀に0を返す環境の2種類に環境が分かれる、ということです。 DXライブラリの再起動後、どの環境でもきちんとProcessMessage関数が0を返すようにはできないでしょうか? あるいは、7以降のOSにおいて上記のプログラムでは不適切なのでしょうか?

Page: 1 |

Re: DXライブラリの再起動について ( No.1 )
名前:いっち 日時:2010/11/24 19:09

DxLib_Init の戻り値はどの様になるのでしょうか?
Re: DXライブラリの再起動について ( No.2 )
名前:管理人 日時:2010/12/01 08:17

初期設定ではDXライブラリは DxLib_End で「ソフトを終了します」というメッセージを 発行してしまうので、Vista以前では無理やり終了せずに実行を続けても動いていたものが、 Vista以降だとそうはいかなくなったのかもしれません 色々弄って対処しようかと思ったのですが、既存の関数 SetDxLibEndPostQuitMessageFlag を 使用することで対処することができましたので、よろしければお試しになってみて下さい // DXライブラリ終了時に PostQuitMessage を呼ぶかどうかのフラグをセットする int SetDxLibEndPostQuitMessageFlag( int Flag ) ; この関数を DxLib_Init の前でも後でもかまいませんので、FALSE を渡して 呼んでください SetDxLibEndPostQuitMessageFlag( FALSE ) ; DxLib_End の際に「ソフトを終了します」というメッセージを発行しなくなります 私の環境ではこれで Vista 上で DxLib_Init と DxLib_End を何度呼んでも正常に 動作しましたので、よろしければお試しください m(_ _)m テストで使用したプログラム スペースキーを押すたびに  DxLib_End DxLib_Init 初期設定 を行います #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, x, add; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // DxLib_End で PostQuitMessage を使用するかどうかのフラグを「使用しない」にセット SetDxLibEndPostQuitMessageFlag( FALSE ) ; // 画像の読み込み handle = LoadGraph( "Test1.bmp" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // メインループ(何かキーが押されたらループを抜ける) x = 0; add = 8; while( ProcessMessage() == 0 ) { // 移動 x += add; if( x < 0 || x > 640 ) add = -add; // 画面のクリア ClearDrawScreen(); // 画像の描画 DrawGraph( x, 0, handle, TRUE ); DrawLine( x, 0, x, 10000, GetColor( 255,255,255 ) ) ; // スペースキーが押されたら DxLib_End を実行する if( GetInputChar( TRUE ) == ' ' ) { // DXライブラリの後始末 DxLib_End() ; // 再初期化 // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 DxLib_Init() ; // 画像の読み込み handle = LoadGraph( "Test1.bmp" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); } // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
Re: DXライブラリの再起動について ( No.3 )
名前:Agate 日時:2010/12/31 11:48

対処ありがとうございました。 当方の環境は元々特にエラーが出ない環境でしたので、テストはできませんが、 これでたぶん直るかと思います。 返信が大幅に遅れたことをお詫び申し上げます。

Page: 1 |