Баг RTL: файл открытый первым не закрывается под голым Wine

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение Vapaamies » 31.12.2014 10:09:07

SSerge писал(а):Так что, коллеги, лажает скорее Wine

Я тоже так думаю.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение Sergei I. Gorelkin » 31.12.2014 10:22:00

По крайней мере wine ведет себя не так, как винда, потому что иначе на эти грабли наступили бы гораздо раньше.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение Mirage » 31.12.2014 15:05:07

SSerge писал(а):Так что, коллеги, лажает скорее Wine, чем RTL - не должно бы ей под пользовательские файлы отдавать дескрипторы ниже пятого.
Ибо "стандартный принтер" с дескриптором 4 во всех виндовс до миллениума влючительно был гарантированно и печатал в обход драйвера на порт LPT, начиная с XP этот поток вроде как перехватывался драйвером и направлялся как plain text на принтер по умолчанию


А магическая константа в коде, без каких-либо комментариев, это разве не лажа?
По мне, так самая что ни на есть.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение pda » 31.12.2014 16:04:19

SSerge писал(а):Так что, коллеги, лажает скорее Wine, чем RTL - не должно бы ей под пользовательские файлы отдавать дескрипторы ниже пятого.
Ибо "стандартный принтер" с дескриптором 4 во всех виндовс до миллениума влючительно был гарантированно и печатал в обход драйвера на порт LPT

Теперь ещё бы понять почему его надо защизать от закрытия. Ещё можно понять зачем stdin/stdout/stderr защищать (хотя на мой взгляд это дурная практика).
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение SSerge » 31.12.2014 16:14:16

pda писал(а):понять почему его надо защизать от закрытия


Потому что нельзя закрывать поток системного принтера. :D Вот нельзя и всё. Закроешь - останешься без принтера до следующей перезагрузки, потому что некому будет открыть его стандартный дескриптор. Точно также и AUX. Опять же смотрим, откуда это все идёт. Вот такие вот MS-DOS и CP/M операционные системы были
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение pda » 31.12.2014 18:11:42

SSerge писал(а):Закроешь - останешься без принтера до следующей перезагрузки,

Это как? В венде эти хендлы все per-process же. В DOS COMx/LPT тоже вроде открывать/закрывать можно было. Или перезагрузки программы? Да по фиг. Если программист в своей программе что-то закрывает, то он должен значть что делает.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение скалогрыз » 01.01.2015 18:33:52

Баг RTL - просто убрать проверку в FileClose() и всё.

Ни FileCreate, ни FileRead, ни FileWrite, ни FileClose().
Код
Код: Выделить всё
  FileWrite(0, 'blah', length('blah'));

тоже не работает, а значит поддержки DOS-совместимых "стандартных устройств" - нет.

Теперь, пишем проверку на безопасность закрытия
Код: Выделить всё
uses Windows, SysUtils;
var
  flags : LongWord;
  i : integer;
  err : LongWord;
  hnd : THandle;
begin
  flags :=0;
  for i:=0 to 20 do begin
    hnd:=THandle(i);
    write(hnd,' ');
    if Windows.GetHandleInformation(hnd, flags) then
      write('is handle: ',IntToHex(flags, 8))
    else begin
      err:= GetLastError;
      if err = ERROR_INVALID_HANDLE then write('invalid handle')
      else write('error: ', err );

      write(' closing ');
      Windows.CloseHandle(hnd);
      err:=GetLastError;
      if err = ERROR_INVALID_HANDLE then write('inavlid handle')
      else write('error: ', err);
    end;
    writeln;
  end;
end.

Попытка закрытия (неправильных) хендлов 0,1, 2,3 - приводит к ожидаемому результату. CloseHandle ругается и возвращает ERROR_INVALID_HANDLE.
Есть кому в 9х проверить?
Так или иначе - ненужную непонятную проверку из win RTL нужно убрать. Wine работает как надо.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение Cheb » 02.01.2015 10:31:13

Пропробовал выставить в вайне "совместимость с Windows 98" для программы - не помогло.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Баг RTL: файл открытый первым не закрывается под голым W

Сообщение скалогрыз » 02.01.2015 19:34:53

Cheb писал(а):Пропробовал выставить в вайне "совместимость с Windows 98" для программы - не помогло.

не должно помочь. Единственно что поможет - убрать проверку из RTL, как ненужную и вредную.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.

Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru