OberonCore https://forum.oberoncore.ru/ |
|
Баг в DevPacker'е? https://forum.oberoncore.ru/viewtopic.php?f=23&t=5071 |
Страница 1 из 1 |
Автор: | Oleg N. Cher [ Четверг, 03 Апрель, 2014 00:34 ] |
Заголовок сообщения: | Баг в DevPacker'е? |
По-моему я нашёл баг в DevPacker'е. Проявляется так. Скачиваем подсистему для раскраски синтаксиса Master (адаптированную мной для BlackBox 1.6). Лучше всего экспериментировать в Красноярской сборке Ивана Денисова, т.к. она имеет возможность автоматизации процесса упаковывания всей сборки в EXE, для чего в ней присутствует модуль RedSubs с командой PackAllToExe (в меню: Red -> Упаковать всё в EXE). Распакуем Master в сборку Red, запустим, появится новый пункт меню — Мастер. Теперь собираем всю сборку в один EXE, переместим этот EXE'шник в другую папку (чтобы исключить чтение не из упакованной ФС, а извне) и запустим. Теперь при попытке раскрасить синтаксис: Мастер -> Раскрасить активный документ стабильно получается такое сообщение в логе: Не найден файл Master/Rsrc/DefaultSyntaxAttributes.syn Хотя, разумеется, этот файл пакуется, я проверил: EXE'шник становится больше на примерно его размер. Но что подозрительно — в теле EXE'шника простым поиском строка DefaultSyntaxAttributes.syn не находится. Читается этот файл процедурой MasterColors.Init, вызываемой из инициализатора модуля MasterColors. Выглядит она так: Код: PROCEDURE Init; т.е. должна работать в EXE, собранном DevPacker'ом, потому как он эмулирует виртуальную файловую систему.VAR file: Files.File; BEGIN file := Files.dir.Old(Files.dir.This("Master/Rsrc/"), "DefaultSyntaxAttributes.syn", FALSE); IF file # NIL THEN IntAttr(file); file.Close() ELSE StdLog.String("Не найден файл Master/Rsrc/DefaultSyntaxAttributes.syn"); StdLog.Ln() END; MasterColorScanner.InitSyntaxAttributes(syntax); END Init; Мы уже пытались чуть-чуть разобраться с Иваном Кузьмицким, стало ясно, что проблема, скорее всего, в DevPacker'е, но где именно — надо рыть, на что лично у меня не хватает квалификации, поэтому и пишу. Посоветуйте что-нибудь. Спасибо. |
Автор: | Александр Ильин [ Четверг, 03 Апрель, 2014 05:26 ] |
Заголовок сообщения: | Re: Баг в DevPacker'е? |
Возможно, есть ограничение на число символов в имени упакованного файла. Попробуйте поискать в EXE не имя файла целиком, а подстроку из него. |
Автор: | Пётр Кушнир [ Четверг, 03 Апрель, 2014 10:07 ] |
Заголовок сообщения: | Re: Баг в DevPacker'е? |
Не могу подтвердить баг. Упаковываю Master в исполняемый файл, убираю подсистему из сборки ББ, потом запускаю его, иду в ObxFileTree, нахожу нужный файл и открываю его, вижу всякий мусор, который там и должен быть. А вообще мне кажется, что модуль HostPackedFiles не позволяет открывать файлы в режиме Files.exclusive (константа FALSE). Поэтому и возвращает NIL в процитированном куске кода. |
Автор: | Евгений Темиргалеев [ Четверг, 03 Апрель, 2014 10:12 ] |
Заголовок сообщения: | Re: Баг в DevPacker'е? |
Пётр Кушнир писал(а): А вообще мне кажется, что модуль HostPackedFiles не позволяет открывать файлы в режиме Files.exclusive (константа FALSE). Поэтому и возвращает NIL в процитированном куске кода. Так и есть --- упакованные файлы только читаются...И хороший пример, что константы Files.shared, Files.exclusive не просто так заведены. Пётр разглядел Files.exclusive в FALSE. А сколько народу, включая меня, пропустило? |
Автор: | Пётр Кушнир [ Четверг, 03 Апрель, 2014 14:00 ] |
Заголовок сообщения: | Re: Баг в DevPacker'е? |
Вспомнил, что уже сталкивался с проблемой некорректной работы компонентов в режиме только чтения. Проблему решил обычным способом. Цитата: Код: (* копирует файл из образа наружу и открывает для записи *) PROCEDURE (d: Directory) Old (loc: Files.Locator; name: Files.Name; shared: BOOLEAN): Files.File; VAR f, f0: Files.File; rd: Files.Reader; wr: Files.Writer; x: BYTE; BEGIN f := orgdir.Old(loc, name, shared); IF f = NIL THEN f := packedDir.Old(loc, name, Files.shared); IF (f#NIL) & ~shared THEN f0:=orgdir.New(loc, Files.dontAsk); IF f0#NIL THEN rd:=f.NewReader(NIL); rd.SetPos(0); wr:=f0.NewWriter(NIL); REPEAT rd.ReadByte(x); wr.WriteByte(x); UNTIL rd.eof; f0.Register(name$, '', Files.dontAsk, loc.res); IF loc.res=0 THEN f0.Close; f := orgdir.Old(loc, name, shared); ELSE f:=NIL END; ELSE f:=NIL END END; END; RETURN f END Old; |
Автор: | Oleg N. Cher [ Четверг, 03 Апрель, 2014 14:04 ] |
Заголовок сообщения: | Re: Баг в DevPacker'е? |
Что ж, Пётр прав, действительно, всё так. Надо придумать как адаптировать Master к работе в упакованном режиме. Всем спасибо. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |