Have you ever noticed that your program is running slowly because you have waaaaaay too many calls to OutputDebugString (ODS) ?
What’s worse, is when it’s a complete waste, because there is no program running to benefit from ODS calls.
Here’s a programmatic way to detect if a viewer is running
P.S. my favorite ODS viewer is DebugView++ https://github.com/djeedjay/DebugViewPP
The following code is based on VB code written by Carl Barnes.
Carl based his work on info found here: http://www.unixwiz.net/techtips/outputdebugstring.html
PROGRAM
INCLUDE('Windows.inc'),ONCE
MAP
OutputDebugStringNotReady(),LONG
MODULE('Standard Windows APIs')
OpenEvent (DWORD InDesiredAccess, BOOL InInheritHandle, |
*CSTRING InName),HANDLE,RAW,PASCAL,NAME('OpenEventA')
!already declared in Windows.inc! GetLastError (),DWORD,PASCAL
!already declared in Windows.inc! CloseHandle (HANDLE InObject),BOOL,PASCAL
END
END
CODE
MESSAGE('An OutputDebugString View is ['& |
CHOOSE( OutputDebugStringNotReady()=0, |
'Running', 'NOT Running') &']')
OutputDebugStringNotReady PROCEDURE()!,LONG
!Ported from VB6 Code written by *Carl Barnes*
!PSS: OutputDebugString is expensive requiring a switch to kernel mode to access event, mutex and MMF. See
! http://www.unixwiz.net/techtips/outputdebugstring.html
hObject HANDLE,AUTO
SYNCHRONIZE DWORD(100000h) ! 10 0000
szEventName CSTRING('DBWIN_BUFFER_READY') !case sensitive
RetError LONG,AUTO
CODE
hObject = OpenEvent(SYNCHRONIZE, FALSE, szEventName)
IF hObject <> 0
CloseHandle(hObject)
RetError = 0 !We are ready
ELSE
RetError = GetLastError()
! probably 2 = File Not Found,
! i.e. the Event name does not exist because there is no debugger
IF RetError = 0
RetError = -1 ! no handle and no error, then say -1
END
END
RETURN RetError