Re: SetWindowVisibleFlagのバグ? ( No.1 ) |
- 名前:管理人 日時:2012/10/20 19:26
ご報告ありがとうございます
私の手元で以下のようなプログラムを実行してみましたが、プロセスが残るということはありませんでした
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// ウインドウを非表示
SetWindowVisibleFlag( FALSE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
よろしければ紙袋さんの環境でもプロセスが残らないか試してみていただけないでしょうか?
|
Re: SetWindowVisibleFlagのバグ? ( No.2 ) |
- 名前:紙袋 日時:2012/10/20 21:08
管理人様のプログラムでは私のほうでもプロセスは残りませんでした
問題が発生したのはダイアログを使用したプログラムなのですがそれが問題かもしれません
ソースコードを貼っておきます
#include <DxLib.h>
#include <tchar.h>
#include "resource.h"
LRESULT CALLBACK DialogProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmsLine,int nCmdShow)
{
HWND hMainWnd = nullptr;
HWND hDialogWnd = nullptr;
//ウインドウモードで起動
ChangeWindowMode(TRUE);
//アイコンの登録
SetWindowIconID(IDI_ICON2);
//ウインドウの非表示
SetWindowVisibleFlag(FALSE);
//DxLibの初期化
if(DxLib_Init() == -1) return -1;
//メインウインドウのハンドルの保存
hMainWnd = GetMainWindowHandle();
//ダイアログの作成
hDialogWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hMainWnd,(DLGPROC)DialogProc);
//ダイアログの登録
SetDialogBoxHandle(hDialogWnd);
//ダイアログの表示
ShowWindow(hDialogWnd,SW_SHOW);
//描画先を裏に指定
SetDrawScreen(DX_SCREEN_BACK);
//メインループ
while(ProcessMessage() == 0 && ClearDrawScreen() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE) )
{
ScreenFlip();
}
//DxLibの終了処理
DxLib_End();
return 0;
}
LRESULT CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
//ダイアログの破棄
DestroyWindow(hWnd);
//DxLibの終了処理
DxLib_End();
//プログラムの正常終了
exit(0);
break;
case WM_INITDIALOG:
break;
default:
break;
}
return 0;
}
プロセスを見ると、DxLib_End()はしっかり呼ばれているようで少しだけプロセスにメモリが残るみたいです
|
Re: SetWindowVisibleFlagのバグ? ( No.3 ) |
- 名前:紙袋(解決) 日時:2012/10/20 21:54
DialogProc関数の中のswitch文のcaseにWM_DESTROYを入れて、そこにPostQuitMessageと終了処理を入れたらプロセスが無事消えました
ご迷惑かけてすいませんでした
|
Re: SetWindowVisibleFlagのバグ? ( No.4 ) |
- 名前:紙袋 日時:2012/10/20 21:57
と、思ったら完全に消える時と消えない時があるみたいです・・・
変更したDialogProcの部分を貼っておきます
LRESULT CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
//ダイアログの破棄
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
//DxLibの終了処理
DxLib_End();
//プログラムの正常終了
exit(0);
break;
case WM_INITDIALOG:
break;
default:
break;
}
return 0;
}
よろしくお願いします
|
Re: SetWindowVisibleFlagのバグ? ( No.5 ) |
- 名前:管理人 日時:2012/10/20 22:09
再現プログラムを載せていただきありがとうございます、こちらでも現象を確認できました
「メインウインドウが非アクティブの間はプログラムを停止する」という処理が DxLib_End の間も有効になっていたためでした
ただ、この動作は修正はしましたが、基本的にダイアログにアクセスしている間はDXライブラリのウインドウとしては「非アクティブ」の状態なので
DxLib_Init の前に SetAlwaysRunFlag( TRUE ) ; を記述してウインドウが非アクティブの状態でもプログラムが停止しないようにしないと
恐らくDXライブラリの色々な所に仕掛けてある「ウインドウが非アクティブの場合はプログラムを停止する」処理に引っかかって
DxLib_End を呼ぶ前にプログラムが停止してしまうと思います
ともあれ、再現プログラムは正常に動作するようになったバージョンをこちらにアップしましたので、
よろしければお使いください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
ちなみに SetAlwaysRunFlag( TRUE ) ; を DxLib_Init の前で実行した場合は恐らく今回の修正版を使用しなくても
プロセスが終了しないという現象は解消できると思います
|
Re: SetWindowVisibleFlagのバグ? ( No.6 ) |
- 名前:紙袋(解決) 日時:2012/10/20 22:42
無事プロセスから消えるようになりました
ありがとうございました
|