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