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

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

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

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

Сообщение Vapaamies »

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

Я тоже так думаю.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

По крайней мере wine ведет себя не так, как винда, потому что иначе на эти грабли наступили бы гораздо раньше.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

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


А магическая константа в коде, без каких-либо комментариев, это разве не лажа?
По мне, так самая что ни на есть.
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

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

Теперь ещё бы понять почему его надо защизать от закрытия. Ещё можно понять зачем stdin/stdout/stderr защищать (хотя на мой взгляд это дурная практика).
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


Потому что нельзя закрывать поток системного принтера. :D Вот нельзя и всё. Закроешь - останешься без принтера до следующей перезагрузки, потому что некому будет открыть его стандартный дескриптор. Точно также и AUX. Опять же смотрим, откуда это все идёт. Вот такие вот MS-DOS и CP/M операционные системы были
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

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

Это как? В венде эти хендлы все per-process же. В DOS COMx/LPT тоже вроде открывать/закрывать можно было. Или перезагрузки программы? Да по фиг. Если программист в своей программе что-то закрывает, то он должен значть что делает.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Баг 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 работает как надо.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

Пропробовал выставить в вайне "совместимость с Windows 98" для программы - не помогло.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

не должно помочь. Единственно что поможет - убрать проверку из RTL, как ненужную и вредную.
Ответить