'debug.sbp 'このファイル内のコードはデバッグ コンパイル時のみ有効です(リリース コンパイルでは無視されます)。 'Dim _DebugSys_dwThreadID[255] As DWord - コンパイラが自動的に定義します 'Dim _DebugSys_ProcNum[255] As DWord - コンパイラが自動的に定義します 'Dim _DebugSys_lplpObp[255] As *ULONG_PTR - コンパイラが自動的に定義します 'Dim _DebugSys_lplpSpBase[255] As *ULONG_PTR - コンパイラが自動的に定義します Function _DebugSys_GetThread() As Long Dim dwThreadID As DWord Dim ThreadNum As Long dwThreadID=GetCurrentThreadId() ThreadNum=0 Do If dwThreadID=_DebugSys_dwThreadID[ThreadNum] Then Exit Do ThreadNum=ThreadNum+1 If ThreadNum>255 Then ThreadNum=-1 Exit Do /*debug OutputDebugString(Ex"[GetThread]デバッグ情報が異常です。プロセスを終了します。\r\n") ExitProcess(0)*/ End If Loop _DebugSys_GetThread=ThreadNum End Function /*! @brief デバッグ用Set_LONG_PTR。 削除すると、ABプログラムが正常にデバッグ実行できなくなる。 */ Sub _DebugSys_Set_LONG_PTR(pPtr As VoidPtr, lpData As LONG_PTR) #ifdef _WIN64 SetQWord(pPtr,lpData) #else SetDWord(pPtr,lpData) #endif End Sub Sub _DebugSys_StartProc(lpSpBase As ULONG_PTR, lpObp As ULONG_PTR) Dim i As Long Dim ThreadNum As Long ThreadNum=_DebugSys_GetThread() If ThreadNum=-1 Then Exit Sub If _DebugSys_lplpObp[ThreadNum] Then i=(_DebugSys_ProcNum[ThreadNum]+2)*SizeOf(ULONG_PTR) _DebugSys_lplpObp[ThreadNum]=HeapReAlloc(GetProcessHeap(),0,_DebugSys_lplpObp[ThreadNum],i) _DebugSys_lplpSpBase[ThreadNum]=HeapReAlloc(GetProcessHeap(),0,_DebugSys_lplpSpBase[ThreadNum],i) Else _DebugSys_ProcNum[ThreadNum]=0 _DebugSys_lplpObp[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2) _DebugSys_lplpSpBase[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2) End If _DebugSys_Set_LONG_PTR(_DebugSys_lplpObp[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR),lpObp) _DebugSys_Set_LONG_PTR(_DebugSys_lplpSpBase[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR),lpSpBase) _DebugSys_ProcNum[ThreadNum]=_DebugSys_ProcNum[ThreadNum]+1 End Sub Sub _DebugSys_EndProc() Dim ThreadNum As Long ThreadNum=_DebugSys_GetThread() If ThreadNum=-1 Then Exit Sub _DebugSys_ProcNum[ThreadNum]=_DebugSys_ProcNum[ThreadNum]-1 End Sub Sub _DebugSys_SaveContext(lpSpBase As ULONG_PTR, lpObp As ULONG_PTR) Dim ThreadNum As Long ThreadNum=_DebugSys_GetThread() If ThreadNum=-1 Then Exit Sub If _DebugSys_lplpObp[ThreadNum]=0 Then _DebugSys_ProcNum[ThreadNum]=0 _DebugSys_lplpObp[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2) _DebugSys_lplpSpBase[ThreadNum]=HeapAlloc(GetProcessHeap(),0,SizeOf(ULONG_PTR)*2) End If _DebugSys_Set_LONG_PTR(_DebugSys_lplpObp[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR), lpObp) _DebugSys_Set_LONG_PTR(_DebugSys_lplpSpBase[ThreadNum]+_DebugSys_ProcNum[ThreadNum]*SizeOf(ULONG_PTR), lpSpBase) End Sub Sub _esp_error() MessageBox( NULL, "esp is wrong value.", "debug check error", MB_OK or MB_ICONEXCLAMATION ) End Sub Sub _System_DebugOnly_OutputDebugString(buffer As *Char) #ifdef _DEBUG OutputDebugString(buffer) #endif End Sub