log_windows.go 687 B

1234567891011121314151617181920212223242526272829303132333435
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. package app
  3. import (
  4. "log"
  5. "unsafe"
  6. syscall "golang.org/x/sys/windows"
  7. )
  8. type logger struct{}
  9. var (
  10. kernel32 = syscall.NewLazySystemDLL("kernel32")
  11. outputDebugStringW = kernel32.NewProc("OutputDebugStringW")
  12. debugView *logger
  13. )
  14. func init() {
  15. // Windows DebugView already includes timestamps.
  16. if syscall.Stderr == 0 {
  17. log.SetFlags(log.Flags() &^ log.LstdFlags)
  18. log.SetOutput(debugView)
  19. }
  20. }
  21. func (l *logger) Write(buf []byte) (int, error) {
  22. p, err := syscall.UTF16PtrFromString(string(buf))
  23. if err != nil {
  24. return 0, err
  25. }
  26. outputDebugStringW.Call(uintptr(unsafe.Pointer(p)))
  27. return len(buf), nil
  28. }