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|
  63|  if ( Errors_poolCount <= 0 ) {
  64|    ERRORS_WARNING_0( "Errors_endPool が多すぎるか startPool していない" );
  65|    return;
  66|  }
  67|  Errors_poolCount --;
  68|
  69|  /* メッセージがたまっていなかったら、表示しない */
  70|  if ( Errors_poolCount > 0 || Errors_log_p == Errors_poolStart ||
  71|       Errors_poolStart == NULL )  return;
  72|
  73|  /* メモリ res 上にダイアログ・リソースを作成する */
  74|  {
  75|    memset( res, 0, sizeof(res) );
  76|
  77|    /* ダイアログ */
  78|    p = res;
  79|    {
  80|      DLGTEMPLATE*  t = (DLGTEMPLATE*)p;
  81|      t->style = ( WS_CAPTION | WS_DLGFRAME | WS_POPUP | DS_MODALFRAME | DS_SETFONT | DS_CENTER );
  82|      t->x = 0;
  83|      t->y = 0;
  84|      t->cx = 300;
  85|      t->cy = 127;
  86|      t->dwExtendedStyle = 0;
  87|      t->cdit = 2;
  88|      p += sizeof( DLGTEMPLATE );
  89|    }
  90|    *(WORD*)p = 0;  p += sizeof(WORD);  /* menu */
  91|    *(WORD*)p = 0;  p += sizeof(WORD);  /* winClass */
  92|    wcscpy( (WCHAR*)p, L"エラーの詳細" );  p += 14;  /* caption */
  93|    *(WORD*)p = 10;  p += sizeof(WORD);  /* fontSize */
  94|    wcscpy( (WCHAR*)p, L"MS P明朝" );  p += 14;  /* fontName */
  95|
  96|    /* エディットボックス */
  97|    p = (char*)( (int)(p + 3) & ~0x3 );
  98|    {
  99|      DLGITEMTEMPLATE*  t = (DLGITEMTEMPLATE*)p;
 100|      t->id = 0x1081;
 101|      t->style = ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | ES_LEFT |
 102|        WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL |
 103|        ES_NOHIDESEL | ES_WANTRETURN | ES_READONLY );
 104|      t->x = 3;
 105|      t->y = 3;
 106|      t->cx = 294;
 107|      t->cy = 100;
 108|      t->dwExtendedStyle = 0;
 109|      p += sizeof( DLGTEMPLATE );
 110|    }
 111|    *(WORD*)p = 0xFFFF;  p += sizeof(WORD);  /* atom */
 112|    *(WORD*)p = 0x0081;  p += sizeof(WORD);  /* Edit */
 113|    *(WORD*)p = 0x0000;  p += sizeof(WORD);  /* caption */
 114|    *(WORD*)p = 0;   p += sizeof(WORD);  /* nCtrlByte */
 115|
 116|    /* ボタン */
 117|    p = (char*)( (int)(p + 3) & ~0x3 );
 118|    {
 119|      DLGITEMTEMPLATE*  t = (DLGITEMTEMPLATE*)p;
 120|      t->id = 0x1;
 121|      t->style = ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON );
 122|      t->x = 134;
 123|      t->y = 109;
 124|      t->cx = 40;
 125|      t->cy = 12;
 126|      t->dwExtendedStyle = 0;
 127|      p += sizeof( DLGTEMPLATE );
 128|    }
 129|    *(WORD*)p = 0xFFFF;  p += sizeof(WORD);  /* atom */
 130|    *(WORD*)p = 0x0080;  p += sizeof(WORD);  /* Button */
 131|    wcscpy( (WCHAR*)p, L"&OK" );  p += 4 * sizeof(WCHAR);  /* caption */
 132|    *(WORD*)p = 0;       p += sizeof(WORD);  /* nCtrlByte */
 133|  }
 134|
 135|  /* 表示するメッセージを作成する */
 136|  {
 137|    p = msg;
 138|    if ( Errors_log_p < Errors_poolStart ) {
 139|      strcpy( p, Errors_poolStart );
 140|      p = strchr( p, '\0' ) + 1;
 141|      Errors_poolStart = Errors_log;
 142|    }
 143|    strncpy( p, Errors_poolStart, Errors_log_p - Errors_poolStart );
 144|    p += Errors_log_p - Errors_poolStart;
 145|    *p = '\0';
 146|  }
 147|
 148|  /* ウィンドウにメッセージを表示する */
 149|  {
 150|    CDialog  dlg;
 151|    HWND  w;
 152|
 153|    dlg.CreateIndirect( (DLGTEMPLATE*)res,
 154|      ( Errors_parentCWnd == NULL ? NULL : (CWnd*)Errors_parentCWnd ) );
 155|    w = GetDlgItem( dlg.m_hWnd, 0x1081 );  SetWindowText( w, msg );
 156|    w = GetDlgItem( dlg.m_hWnd, 0x1 );  SetFocus( w );
 157|    dlg.ShowWindow( SW_SHOW );
 158|    dlg.RunModalLoop(0);
 159|    dlg.EndDialog( 0 );
 160|    dlg.DestroyWindow();
 161|  }
 162|
 163|  /* ためていたメッセージをクリアする */
 164|  Errors_poolStart = NULL;
 165|}
 166|
 167|
 168|
 169| 
 170|/**************************************************************************
 171|  2-3. <<< [Errors_endAllPool_release] ためたウィンドウ出力を表示する >>> 
 172|【補足】
 173|・ネストしている場合でも、表示して、ネストをなくします。
 174|***************************************************************************/
 175|void  Errors_endAllPool_release()
 176|{
 177|  do {
 178|    Errors_endPool_release();
 179|  } while ( Errors_poolCount > 0 );
 180|}
 181|
 182|
 183|
 184| 
 185|/**************************************************************************
 186|  2-4. <<< [Errors_clearPool_release] ためたウィンドウ出力を表示しないでクリアする >>> 
 187|***************************************************************************/
 188|void  Errors_clearPool_release()
 189|{
 190|#if 0
 191|  Errors_poolCount = 0;
 192|  Errors_poolStart = NULL;
 193|#else
 194|  ASSERT( Errors_poolCount > 0 );
 195|  Errors_poolCount --;
 196|
 197|  if ( Errors_poolCount == 0 )
 198|    Errors_poolStart = NULL;
 199|#endif
 200|}
 201|
 202| 
 203|#endif  /* #if  defined(ERRORS_PRINTF_TO_WINDOW) && defined(FOR_WIN32) */ 
 204| 
 205|