| 1 | 'debug.sbp
 | 
|---|
| 2 | 'このファイル内のコードはデバッグ コンパイル時のみ有効です(リリース コンパイルでは無視されます)。
 | 
|---|
| 3 | 
 | 
|---|
| 4 | 'Dim _DebugSys_dwThreadID[255] As DWord         - コンパイラが自動的に定義します
 | 
|---|
| 5 | 'Dim _DebugSys_ProcNum[255] As DWord            - コンパイラが自動的に定義します
 | 
|---|
| 6 | 'Dim _DebugSys_lplpObp[255] As *ULONG_PTR       - コンパイラが自動的に定義します
 | 
|---|
| 7 | 'Dim _DebugSys_lplpSpBase[255] As *ULONG_PTR    - コンパイラが自動的に定義します
 | 
|---|
| 8 | 
 | 
|---|
| 9 | Function _DebugSys_GetThread() As Long
 | 
|---|
| 10 |     Dim dwThreadID As DWord
 | 
|---|
| 11 |     Dim ThreadNum As Long
 | 
|---|
| 12 | 
 | 
|---|
| 13 |     dwThreadID=GetCurrentThreadId()
 | 
|---|
| 14 |     ThreadNum=0
 | 
|---|
| 15 |     Do
 | 
|---|
| 16 |         If dwThreadID=_DebugSys_dwThreadID[ThreadNum] Then Exit Do
 | 
|---|
| 17 |         ThreadNum=ThreadNum+1
 | 
|---|
| 18 |         If ThreadNum>255 Then
 | 
|---|
| 19 |             ThreadNum=-1
 | 
|---|
| 20 |             Exit Do
 | 
|---|
| 21 | 
 | 
|---|
| 22 |             /*debug
 | 
|---|
| 23 |             OutputDebugString(Ex"[GetThread]デバッグ情報が異常です。プロセスを終了します。\r\n")
 | 
|---|
| 24 |             ExitProcess(0)*/
 | 
|---|
| 25 |         End If
 | 
|---|
| 26 |     Loop
 | 
|---|
| 27 | 
 | 
|---|
| 28 |     _DebugSys_GetThread=ThreadNum
 | 
|---|
| 29 | End Function
 | 
|---|
| 30 | 
 | 
|---|
| 31 | /*!
 | 
|---|
| 32 | @brief デバッグ用Set_LONG_PTR。
 | 
|---|
| 33 | 削除すると、ABプログラムが正常にデバッグ実行できなくなる。
 | 
|---|
| 34 | */
 | 
|---|
| 35 | Sub _DebugSys_Set_LONG_PTR(pPtr As VoidPtr, lpData As LONG_PTR)
 | 
|---|
| 36 | #ifdef _WIN64
 | 
|---|
| 37 |     SetQWord(pPtr,lpData)
 | 
|---|
| 38 | #else
 | 
|---|
| 39 |     SetDWord(pPtr,lpData)
 | 
|---|
| 40 | #endif
 | 
|---|
| 41 | End Sub
 | 
|---|
| 42 | 
 | 
|---|
| 43 | Sub _DebugSys_StartProc(lpSpBase As ULONG_PTR, lpObp As ULONG_PTR)
 | 
|---|
| 44 |     Dim i As Long
 | 
|---|
| 45 | 
 | 
|---|
| 46 |     Dim ThreadNum As Long
 | 
|---|
| 47 |     ThreadNum=_DebugSys_GetThread()
 | 
|---|
| 48 |     If ThreadNum=-1 Then Exit Sub
 | 
|---|
| 49 | 
 | 
|---|
| 50 |     If _DebugSys_lplpObp[ThreadNum] Then
 | 
|---|
| 51 |         i=(_DebugSys_ProcNum[ThreadNum]+2)*SizeOf(ULONG_PTR)
 | 
|---|
| 52 |         _DebugSys_lplpObp[ThreadNum]=HeapReAlloc(GetProcessHeap(),0,_DebugSys_lplpObp[ThreadNum],i)
 | 
|---|
| 53 |         _DebugSys_lplpSpBase[ThreadNum]=HeapReAlloc(GetProcessHeap(),0,_DebugSys_lplpSpBase[ThreadNum],i)
 | 
|---|
| 54 |     Else
 | 
|---|
| 55 |         _DebugSys_ProcNum[ThreadNum]=0
 | 
|---|
| 56 |         _DebugSys_lplpObp[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2)
 | 
|---|
| 57 |         _DebugSys_lplpSpBase[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2)
 | 
|---|
| 58 |     End If
 | 
|---|
| 59 |     _DebugSys_Set_LONG_PTR(_DebugSys_lplpObp[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR),lpObp)
 | 
|---|
| 60 |     _DebugSys_Set_LONG_PTR(_DebugSys_lplpSpBase[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR),lpSpBase)
 | 
|---|
| 61 | 
 | 
|---|
| 62 |     _DebugSys_ProcNum[ThreadNum]=_DebugSys_ProcNum[ThreadNum]+1
 | 
|---|
| 63 | End Sub
 | 
|---|
| 64 | 
 | 
|---|
| 65 | Sub _DebugSys_EndProc()
 | 
|---|
| 66 |     Dim ThreadNum As Long
 | 
|---|
| 67 |     ThreadNum=_DebugSys_GetThread()
 | 
|---|
| 68 |     If ThreadNum=-1 Then Exit Sub
 | 
|---|
| 69 | 
 | 
|---|
| 70 |     _DebugSys_ProcNum[ThreadNum]=_DebugSys_ProcNum[ThreadNum]-1
 | 
|---|
| 71 | End Sub
 | 
|---|
| 72 | 
 | 
|---|
| 73 | Sub _DebugSys_SaveContext(lpSpBase As ULONG_PTR, lpObp As ULONG_PTR)
 | 
|---|
| 74 |     Dim ThreadNum As Long
 | 
|---|
| 75 |     ThreadNum=_DebugSys_GetThread()
 | 
|---|
| 76 |     If ThreadNum=-1 Then Exit Sub
 | 
|---|
| 77 | 
 | 
|---|
| 78 |     If _DebugSys_lplpObp[ThreadNum]=0 Then
 | 
|---|
| 79 |         _DebugSys_ProcNum[ThreadNum]=0
 | 
|---|
| 80 |         _DebugSys_lplpObp[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2)
 | 
|---|
| 81 |         _DebugSys_lplpSpBase[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2)
 | 
|---|
| 82 |     End If
 | 
|---|
| 83 |     _DebugSys_Set_LONG_PTR(_DebugSys_lplpObp[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR), lpObp)
 | 
|---|
| 84 |     _DebugSys_Set_LONG_PTR(_DebugSys_lplpSpBase[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR), lpSpBase)
 | 
|---|
| 85 | End Sub
 | 
|---|
| 86 | 
 | 
|---|
| 87 | Sub _esp_error()
 | 
|---|
| 88 |     MessageBox( NULL, "esp is wrong value.", "debug check error", MB_OK or MB_ICONEXCLAMATION )
 | 
|---|
| 89 | End Sub
 | 
|---|
| 90 | 
 | 
|---|
| 91 | Sub _System_DebugOnly_OutputDebugString(buffer As *Char)
 | 
|---|
| 92 | #ifdef _DEBUG
 | 
|---|
| 93 |     OutputDebugString(buffer)
 | 
|---|
| 94 | #endif
 | 
|---|
| 95 | End Sub
 | 
|---|