OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 12:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Перенаправление stdout в лог
СообщениеДобавлено: Четверг, 04 Декабрь, 2008 11:20 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Жалко. Идея была хорошая. :)

Есть предположение, что RTL не нравится хендл STD_OUTPUT_HANDLE типа PIPE
Цитата:
DWORD GetFileType( HANDLE hFile );
...
Value Meaning
FILE_TYPE_UNKNOWN The type of the specified file is unknown.
FILE_TYPE_DISK The specified file is a disk file.
FILE_TYPE_CHAR The specified file is a character file, typically an LPT device or a console.
FILE_TYPE_PIPE The specified file is either a named or anonymous pipe.

Проблемы со своевременной инициализацией STD_OUTPUT_HANDLE (при предварительной загрузке TestStdToLog) быть не должно. DLL инициализ. после, это слышно (см. инициализ):
Код:
MODULE TestStdToLogDll ["Project1.dll"];

   PROCEDURE Test1*;
   PROCEDURE Test2*;

END TestStdToLogDll.

MODULE TestTemp;
   
   IMPORT TestStdToLogDll, Log;
   
   PROCEDURE Do1*;
   BEGIN
      Log.String("Test1:"); Log.Ln;
      TestStdToLogDll.Test1
   END Do1;

   PROCEDURE Do2*;
   BEGIN
      Log.String("Test2:"); Log.Ln;
      TestStdToLogDll.Test2
   END Do2;
   
END TestTemp.

^Q "Kernel.LoadMod('TestStdToLog')"
^Q TestTemp.Do1
^Q TestTemp.Do2
^Q DevDebug.UnloadThis TestStdToLog

(* Delphi dll *)
library Project1;

uses SysUtils, Classes, Windows;

{$R *.res}

procedure Test1;
begin
  writeln('x'#9'='#9, 1);
end;

procedure Test2;
  var n: Cardinal; res: LongBool;
begin
  res := Windows.WriteFile(GetStdHandle(Windows.STD_OUTPUT_HANDLE), 'Test'#9'**'#10, 8, n, nil);
end;

exports Test1, Test2;

begin
  Windows.Beep(1000, 1000)
end.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перенаправление stdout в лог
СообщениеДобавлено: Пятница, 05 Декабрь, 2008 16:21 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
Дело, не в КП. Тестовая программа на С с подменой хандлов, не работает.
Код:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
   HANDLE oldStdIn, oldStdOut;
   HANDLE newStdIn, newStdOut;
   BOOL res;
   oldStdIn = GetStdHandle(STD_INPUT_HANDLE);
   oldStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   newStdOut = CreateFile(argv[1],                // name of the write
                       GENERIC_WRITE,          // open for writing
                       0,                      // do not share
                       NULL,                   // default security
                       CREATE_ALWAYS,          // overwrite existing
                       FILE_ATTRIBUTE_NORMAL,  // normal file
                       NULL);                  // no attr. template

    if (newStdOut == INVALID_HANDLE_VALUE)
    {
        printf("Could not open file (error %d)\n", GetLastError());
        return -1;
    } else {
      res = SetStdHandle(STD_OUTPUT_HANDLE, newStdOut);
      if (!res) { printf("Cannot set standart handle"); return -2;}
      printf("This message must be in file\n");
      res = SetStdHandle(STD_OUTPUT_HANDLE, oldStdOut);
      if (!res) { printf("Cannot set standart handle"); return -3;}
      printf("\nEnd test\n");   
      CloseHandle(newStdOut);
   }
   return 0;
}

UPD
http://support.microsoft.com/kb/q105305/
http://www.halcyon.com/~ast/dload/guicon.htm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перенаправление stdout в лог
СообщениеДобавлено: Пятница, 05 Декабрь, 2008 17:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Если Ваша программа консольная, тогда мне кажется, тут дело в инициализации. Ведь рантайм инициализируется (получает хендл) до вызова main.

Чтобы разобраться, надо глядеть исходники библиотек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перенаправление stdout в лог
СообщениеДобавлено: Пятница, 05 Декабрь, 2008 18:34 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
Как я понял из статей (см. ссылки выше), перенаправление ввода\вывода в текущем процессе (в Винде) - проблема. Не решаемая. Поиск по интернету показал, что проблема не новая и не имеет стандартных решений. Удачно перенаправлять можно только подпроцессы.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB