errors_w.cpp

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|