C:\home\SVGCats_src\src\errors_w.cpp
1|/*************************************************************************** 2| 1. <<< テスト&デバッグツール for Windows (errors) >>> 3|****************************************************************************/ 4| 5|//#include <stdafx.h> /* インクルードパスを Visual Studio のプロジェクトファイルのあるフォルダに通してください */ 6|#include "mixer_precomp.h" 7| 8|#ifdef USES_MXP_AUTOINC 9| #include <errors.ah> 10|#endif 11| 12| 13|/*--------------------------------------------------------------------*/ 14|/* 2. <<<<◆ デバッグツール >>>> */ 15|/*--------------------------------------------------------------------*/ 16| 17|int Errors_poolCount = 0; 18| 19| 20|#if defined(FOR_WIN32) 21| 22| 23|/************************************************************************** 24| 2-1. <<< [Errors_startPool_release] ウィンドウ出力をため始める >>> 25|【例】 26| Errors_startPool(); 27| Errors_printf( "a" ); // ここでは、表示しない 28| Errors_printf( "b" ); 29| Errors_endPool(); // ここで、"a", "b" を両方同時に表示する 30|***************************************************************************/ 31|void Errors_startPool_release() 32|{ 33| #if !defined(ERRORS_PRINTF_TO_MEMORY) || !defined(ERRORS_ERR_PRINTF_TO_MEMORY) 34| error2_0( Errors_Unofficial, "ERRORS_PRINTF_TO_MEMORY オプションと" 35| " ERRORS_ERR_PRINTF_TO_MEMORY が必要です。" ); 36| #endif 37| 38| if ( Errors_poolStart == NULL ) 39| Errors_poolStart = Errors_log_p; 40| 41| Errors_poolCount ++; 42|} 43| 44| 45|/************************************************************************** 46| 2-2. <<< [Errors_endPool_release] ためたウィンドウ出力を表示する >>> 47|【補足】 48|・ネストした場合、最も外側の Errors_endPool を呼び出したときのみウィンドウを 49| 表示します。 50|・Endeavor(Win2000,VC++6?) でコンパイルした場合、メインウィンドウが閉じる 51| 前に(OnOK の最後などで)呼び出してください。それに伴い、アプリケーションの 52| 後始末や Errors_chkDefault をメインウィンドウが閉じる前に実行してください。 53| なぜなら、CWinApp::m_pMainWnd を設定した後で、メインウィンドウが無いと、 54| m_CDialog::CreateIndirect の内部でハングアップするためです。 55|***************************************************************************/ 56|void Errors_endPool_release() 57|{ 58| char* p; 59| char res[ sizeof(DLGTEMPLATE) + 34 + 3 + 60| ( sizeof(DLGITEMTEMPLATE) + 8 + 3 ) * 2 + 8 ]; /* ダイアログ・リソース */ 61| char msg[ Errors_log_size * sizeof(WCHAR) ]; /* 表示するメッセージ */ 62| static bool bInFunc = false; 63| 64| if ( Errors_poolCount <= 0 ) { 65| ERRORS_WARNING_0( "Errors_endPool が多すぎるか startPool していない" ); 66| return; 67| } 68| Errors_poolCount --; 69| 70| /* メッセージがたまっていなかったら、表示しない */ 71| if ( Errors_poolCount > 0 || Errors_log_p == Errors_poolStart || 72| Errors_poolStart == NULL ) return; 73| 74| if ( bInFunc ) { 75| Errors_printf_release( "別のスレッドからの二重呼び出しエラー in Errors_endPool_release" ); 76| return; 77| } 78| bInFunc = true; 79| 80| /* メモリ res 上にダイアログ・リソースを作成する */ 81| { 82| memset( res, 0, sizeof(res) ); 83| 84| /* ダイアログ */ 85| p = res; 86| { 87| DLGTEMPLATE* t = (DLGTEMPLATE*)p; 88| t->style = ( WS_CAPTION | WS_DLGFRAME | WS_POPUP | DS_MODALFRAME | DS_SETFONT | DS_CENTER ); 89| t->x = 0; 90| t->y = 0; 91| t->cx = 300; 92| t->cy = 127; 93| t->dwExtendedStyle = 0; 94| t->cdit = 2; 95| p += sizeof( DLGTEMPLATE ); 96| } 97| *(WORD*)p = 0; p += sizeof(WORD); /* menu */ 98| *(WORD*)p = 0; p += sizeof(WORD); /* winClass */ 99| wcscpy( (WCHAR*)p, L"エラーの詳細" ); p += 14; /* caption */ 100| *(WORD*)p = 10; p += sizeof(WORD); /* fontSize */ 101| wcscpy( (WCHAR*)p, L"MS P明朝" ); p += 14; /* fontName */ 102| 103| /* エディットボックス */ 104| p = (char*)( (int)(p + 3) & ~0x3 ); 105| { 106| DLGITEMTEMPLATE* t = (DLGITEMTEMPLATE*)p; 107| t->id = 0x1081; 108| t->style = ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | ES_LEFT | 109| WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | 110| ES_NOHIDESEL | ES_WANTRETURN | ES_READONLY ); 111| t->x = 3; 112| t->y = 3; 113| t->cx = 294; 114| t->cy = 100; 115| t->dwExtendedStyle = 0; 116| p += sizeof( DLGTEMPLATE ); 117| } 118| *(WORD*)p = 0xFFFF; p += sizeof(WORD); /* atom */ 119| *(WORD*)p = 0x0081; p += sizeof(WORD); /* Edit */ 120| *(WORD*)p = 0x0000; p += sizeof(WORD); /* caption */ 121| *(WORD*)p = 0; p += sizeof(WORD); /* nCtrlByte */ 122| 123| /* ボタン */ 124| p = (char*)( (int)(p + 3) & ~0x3 ); 125| { 126| DLGITEMTEMPLATE* t = (DLGITEMTEMPLATE*)p; 127| t->id = 0x1; 128| t->style = ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON ); 129| t->x = 134; 130| t->y = 109; 131| t->cx = 40; 132| t->cy = 12; 133| t->dwExtendedStyle = 0; 134| p += sizeof( DLGTEMPLATE ); 135| } 136| *(WORD*)p = 0xFFFF; p += sizeof(WORD); /* atom */ 137| *(WORD*)p = 0x0080; p += sizeof(WORD); /* Button */ 138| wcscpy( (WCHAR*)p, L"&OK" ); p += 4 * sizeof(WCHAR); /* caption */ 139| *(WORD*)p = 0; p += sizeof(WORD); /* nCtrlByte */ 140| } 141| 142| /* 表示するメッセージを作成する */ 143| { 144| p = msg; 145| if ( Errors_log_p < Errors_poolStart ) { 146| strcpy( p, Errors_poolStart ); 147| p = strchr( p, '\0' ) + 1; 148| Errors_poolStart = Errors_log; 149| } 150| strncpy( p, Errors_poolStart, Errors_log_p - Errors_poolStart ); 151| p += Errors_log_p - Errors_poolStart; 152| *p = '\0'; 153| } 154| 155| /* ウィンドウにメッセージを表示する */ 156| { 157| CDialog dlg; 158| HWND w; 159| 160| dlg.CreateIndirect( (DLGTEMPLATE*)res, 161| ( Errors_parentCWnd == NULL ? NULL : (CWnd*)Errors_parentCWnd ) ); 162| w = GetDlgItem( dlg.m_hWnd, 0x1081 ); SetWindowText( w, msg ); 163| w = GetDlgItem( dlg.m_hWnd, 0x1 ); SetFocus( w ); 164| dlg.ShowWindow( SW_SHOW ); 165| dlg.RunModalLoop(0); 166| dlg.EndDialog( 0 ); 167| dlg.DestroyWindow(); 168| } 169| 170| /* ためていたメッセージをクリアする */ 171| Errors_poolStart = NULL; 172| 173| bInFunc = false; 174|} 175| 176| 177| 178| 179|/************************************************************************** 180| 2-3. <<< [Errors_endAllPool_release] ためたウィンドウ出力を表示する >>> 181|【補足】 182|・ネストしている場合でも、表示して、ネストをなくします。 183|***************************************************************************/ 184|void Errors_endAllPool_release() 185|{ 186| do { 187| Errors_endPool_release(); 188| } while ( Errors_poolCount > 0 ); 189|} 190| 191| 192| 193| 194|/************************************************************************** 195| 2-4. <<< [Errors_clearPool_release] ためたウィンドウ出力を表示しないでクリアする >>> 196|***************************************************************************/ 197|void Errors_clearPool_release() 198|{ 199|#if 0 200| Errors_poolCount = 0; 201| Errors_poolStart = NULL; 202|#else 203| ASSERT( Errors_poolCount > 0 ); 204| Errors_poolCount --; 205| 206| if ( Errors_poolCount == 0 ) 207| Errors_poolStart = NULL; 208|#endif 209|} 210| 211| 212|#endif /* #if defined(ERRORS_PRINTF_TO_WINDOW) && defined(FOR_WIN32) */ 213| 214|