Trurl, спасибо, получилось. QWERTYProgrammer, осталось посмотреть в какой stdout будет писать dll
## Код:
```
MODULE TestStdToLog;

   IMPORT
      WinApi, Dialog, Strings, Log, Services, SYSTEM;

   CONST
      INVALID_HANDLE_VALUE = -1;
   
   TYPE
      Action = POINTER TO RECORD (Services.Action) END;
      
   VAR
      a: Action;
      read, write: WinApi.HANDLE;
   
   PROCEDURE ShowWinErr (IN act: ARRAY OF CHAR);
      VAR   msg: ARRAY 512 OF CHAR; err, res: INTEGER;
   BEGIN
      err := WinApi.GetLastError();
      res := WinApi.FormatMessageW(
         WinApi.FORMAT_MESSAGE_FROM_SYSTEM,
         0, err, 0, msg, LEN(msg), NIL
         );
      IF res = 0 THEN   (* Описание ошибки не получено *)
         Strings.IntToString(err, msg); msg := msg + " (WinAPI-код ошибки)"
      END;
      Dialog.ShowParamMsg("Ошибка при ^0: ^1", act, msg, "")
   END ShowWinErr;

   PROCEDURE WriteChar (c: SHORTCHAR);
   BEGIN
      CASE c OF
      | 09X:   Log.Tab
      | 0AX, 0DX:   Log.Ln
      ELSE
         Log.Char(c)
      END
   END WriteChar;

   PROCEDURE (a: Action) Do;
      VAR   res, avail, n: INTEGER; c: SHORTCHAR;
   BEGIN
      res := WinApi.PeekNamedPipe(read, 0, 0, NIL, avail, NIL);
      (*IF (res = 0) THEN ShowWinErr("PeekNamedPipe") END;*)
      IF (res # 0) & (avail > 0) THEN
         (*Log.Int(avail); Log.Ln;*)
         res := WinApi.ReadFile(read, SYSTEM.ADR(c), 1, n, NIL);
         (*IF (res = 0) THEN ShowWinErr("ReadFile") END;*)
         WHILE (res # 0) & (n = 1) & (avail > 0) DO
            WriteChar(c); DEC(avail);
            IF avail > 0 THEN
               res := WinApi.ReadFile(read, SYSTEM.ADR(c), 1, n, NIL);
               (*IF (res = 0) THEN ShowWinErr("ReadFile") END;*)
            END
         END
      END;
      Services.DoLater(a, Services.Ticks() + Services.resolution)
   END Do;
   
   PROCEDURE Install;
      VAR   res: INTEGER;
   BEGIN
      read := INVALID_HANDLE_VALUE; write := INVALID_HANDLE_VALUE;
      res := WinApi.CreatePipe(read, write, NIL, 0);
      IF res # 0 THEN
         res := WinApi.SetStdHandle(WinApi.STD_OUTPUT_HANDLE, write);
         IF res # 0 THEN
            NEW(a);
            Services.DoLater(a, Services.Ticks() + Services.resolution)
         ELSE
            ShowWinErr("SetStdHandle")
         END
      ELSE
         ShowWinErr("CreatePipe")
      END
   END Install;
   
   PROCEDURE Uninstall;
      VAR   res: INTEGER;
   BEGIN
      IF write # INVALID_HANDLE_VALUE THEN
         res := WinApi.CloseHandle(write); write := INVALID_HANDLE_VALUE;
         IF res = 0 THEN ShowWinErr("CloseHandle(write)") END
      END;
      IF read # INVALID_HANDLE_VALUE THEN
         res := WinApi.CloseHandle(read); read := INVALID_HANDLE_VALUE;
         IF res = 0 THEN ShowWinErr("CloseHandle(read)") END
      END
   END Uninstall;

   PROCEDURE Do*;
      VAR   str: ARRAY 1024 OF SHORTCHAR; res, wr: INTEGER;
   BEGIN
      str := "Тест" + 09X + "Test" + 09X + "***" + 0AX;
      res := WinApi.WriteFile(write, SYSTEM.ADR(str), LEN(str$), wr, NIL);
      IF wr # LEN(str$) THEN ShowWinErr("WriteFile") END
   END Do;

BEGIN
   Install
CLOSE
   Uninstall
END TestStdToLog.

^Q TestStdToLog.Do
```

P.S. Сонным работать не айс... Получилось не сразу
- сначала "не печаталось", из-за Services.DoLater(a, Services.Ticks() + Services.resolution * 1000)
- потом печатался мусор из-за res := WinApi.WriteFile(write, SYSTEM.ADR(str), LEN(str), wr, NIL);
- и повторно "не печаталось" из-за скопированного в начале ... Services.resolution * 1000