OberonCore
https://forum.oberoncore.ru/

Проблема содания exe: illegal memory read при вып-и
https://forum.oberoncore.ru/viewtopic.php?f=81&t=2291
Страница 1 из 2

Автор:  Albertum [ Пятница, 29 Январь, 2010 18:12 ]
Заголовок сообщения:  Проблема содания exe: illegal memory read при вып-и

Здравствуйте!

Написал следующее простое приложение:
Код:
MODULE  Sum;
   IMPORT  Math, ObxAscii;
   
PROCEDURE Main*;
   VAR
      in, out: ObxAscii.Text;
      a, b: INTEGER;
BEGIN
   in := ObxAscii.Open(NIL, 'D:/Temp/input.txt');
   ObxAscii.ReadInt(in, a);
   ObxAscii.ReadInt(in, b);
   
   out := ObxAscii.NewText();
   ObxAscii.WriteInt(out, a + b);
   ObxAscii.Register(out, NIL, 'D:/Temp/output.txt');
      
END Main;   

BEGIN
   Main   
END Sum.
Код:
^Q Sum.Main ~
^Q DevCompiler.Compile ~
^Q DevLinker.LinkExe   dos Sum.exe := National Kernel+  Fonts Dates Math Files Dialog Strings Stores Meta Converters  Services Ports Sequencers Models Log Views Controllers Properties Mechanisms Containers TextModels  Fonts Properties   Views TextMappers Printers Printing TextRulers TextSetters TextViews    ObxAscii Sum ~


При попытке запуска Sum.exe возникает ошибка, хотя через командир всё отлично работает:
Цитата:
illegal memory read [ad = FFFFFFFC]
- TextModels.Attributes.InitFromProp (pc=00000362, fp=0022FF50)
- TextModels.Init (pc=00005DD5, fp=0022FF68)
- TextModels.$$ (pc=0000000A, fp=0022FF78)

Вложение:
Комментарий к файлу: Окно ошибки
bb.png
bb.png [ 37.24 КБ | Просмотров: 11000 ]

Прошу подсказать, в чем проблема.

Автор:  Илья Ермаков [ Пятница, 29 Январь, 2010 21:34 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Задействуются TextModels, а они используют что-то из Fonts.
Т.е. нужна реализация модуля Fonts. Сейчас её нет, т.е. при обращении к Fonts.dir=NIL и возникает этот illegal...

Решение: включите модуль HostFonts.

Автор:  Albertum [ Пятница, 29 Январь, 2010 22:08 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Код:
^Q DevLinker.LinkExe   Sum.exe := National Kernel+  Fonts Dates Math Files Dialog Strings Stores Meta Converters  Services Ports Sequencers Models Log Views Controllers Properties Mechanisms Containers HostFiles HostRegistry HostFonts TextModels  Fonts Properties   Views TextMappers Printers Printing TextRulers TextSetters TextViews    ObxAscii Sum ~

Ошибка:
Цитата:
trap #100
- Dialog.Call (pc=0000337B, fp=0022FB40)
- HostRegistry.Init (pc=0000088F, fp=0022FF68)
- HostRegistry.$$ (pc=0000000A, fp=0022FF78)

В чём причина ошибок такого рода, почему линкер всё собирает и не ругается, а потом такая бяка? Как этого избегать?

Автор:  Илья Ермаков [ Пятница, 29 Январь, 2010 22:14 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Только разбираться, какие службы будут использоваться, и обеспечивать наличие модулей-реализаций (которые втыкают дин. разъёмы).

Проблема общая, связана с тем, что динамическая структура любого приложения не соответствует 1-в-1 статической (модульной). (В немодульных языках она ещё больше усугубляется из-за того, что вообще однозначного "представителя" статической архитектуры в динамике нет).

Решение второй проблемы: Dialog.Call обращается к интерпретатору команд через разъём Dialog.CallHook.
Реализован интерпретатор команд в StdInterpreter. Т.е. - его тоже до кучи надо.

Автор:  Albertum [ Пятница, 29 Январь, 2010 22:49 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Похоже это не закончится :cry: :
Код:
^Q DevLinker.LinkExe   Sum.exe := National Kernel+  Meta Math Fonts Dates  Files Strings Log Dialog Services Stores Converters Ports Sequencers Models Views  StdInterpreter   Meta        Controllers Properties Mechanisms Containers HostFiles HostRegistry HostFonts TextModels  Fonts     TextMappers Printers Printing TextRulers TextSetters TextViews    ObxAscii Sum ~

Цитата:
trap #100
- Dialog.ShowMsg (pc=0000318D, fp=0022E678)
- StdInterpreter.Error (pc=00000200, fp=0022EB04)
- StdInterpreter.CallProc (pc=00000B1B, fp=0022F5A4)
- StdInterpreter.Command (pc=00001261, fp=0022F6B4)
- StdInterpreter.CallHook.Call (pc=00001386, fp=0022FF18)
- Dialog.Call (pc=00003399, fp=0022FF40)
- TextViews.Init (pc=00004B31, fp=0022FF68)
- TextViews.$$ (pc=0000000A, fp=0022FF78)


Поэтому многие и не могут перейти на BB/КП.
Начинают с того, что они считают простым и обламываются.

P.S.
Обходное решение (через Info21olimpIn, Info21olimpOut) нашёл, но не дайте разочароваться в BB, помогите таки слинковать.

Автор:  Иван Кузьмицкий [ Пятница, 29 Январь, 2010 22:56 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Поэтому многие и не могут перейти на BB/КП.
Начинают с того, что они считают простым и обламываются.


Да, есть такое дело. Первое, что хотят сделать - это exe-шник, хотя для ББ это есть идеологическое извращение :)

Я решал проблему линковки крайне тупо, в лоб: делал копию ББ, и запускал exe там. Далее, несколькими итерациями удалял лишнее, пока не становилось ясно, чего же я недолинковал :)

Автор:  Albertum [ Пятница, 29 Январь, 2010 23:06 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Цитата:
Первое, что хотят сделать - это exe-шник, хотя для ББ это есть идеологическое извращение

Объясните кратко почему?
Или "что я делаю не так?"

Автор:  Иван Кузьмицкий [ Пятница, 29 Январь, 2010 23:14 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Потому что exe-шник есть компонент для среды Windows, а ББ - это ведь тоже среда, обеспечивающая своим компонентам собственную экологию.

Автор:  Info21 [ Суббота, 30 Январь, 2010 05:56 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Цитата:
Первое, что хотят сделать - это exe-шник, хотя для ББ это есть идеологическое извращение

Объясните кратко почему?
Или "что я делаю не так?"
Полезно еще добавлять, что exe-шник в ББ уже готов -- это BlackBox.exe. Его нужно просто переименовать :)
Изготовление приложения состоит в настройке всего остального -- дописывании функциональности, а в конце -- выкидывания лишнего и настройке меню, конфигурации ББ при запуске и т.п, чтобы при запуске открывались какие-нибудь формочки для клиента, и меню были соответствующие.

Автор:  Валерий Лаптев [ Суббота, 30 Январь, 2010 07:56 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Поэтому многие и не могут перейти на BB/КП.
Начинают с того, что они считают простым и обламываются.

Браво!
Проблема примерно такая же, как при переходе с процедурного языка на функциональный: мозги надо повернуть.
В некоторых местах... :)

Автор:  Сергей Оборотов [ Суббота, 30 Январь, 2010 16:19 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
В чём причина ошибок такого рода, почему линкер всё собирает и не ругается, а потом такая бяка? Как этого избегать?
Если часто с этим встречаетесь перепишите модули, которые обращаются к динамическим разъёмам. На предмет проверки наличия реализации. Из действий по умолчанию действительно мало понятно что требуется.

Автор:  id_ler [ Воскресенье, 31 Январь, 2010 09:19 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
В чём причина ошибок такого рода, почему линкер всё собирает и не ругается, а потом такая бяка? Как этого избегать?


Чтобы слинковать и запускать без ошибки возможен следующий вариант. Во-первых, убрать из модуля окончание
Код:

BEGIN
     Main
и линковать в такой конфигурации
Код:
(!) DevLinker.Link dos
Sum.exe := National Kernel$+ Files HostFiles StdLoader Math Strings Dates Meta Dialog Services
Fonts Ports Stores Log Converters Sequencers Models Printers Views
Controllers Properties Printing Mechanisms Containers
Documents Windows StdCFrames Controls StdDialog StdApi StdCmds StdInterpreter
HostRegistry HostFonts HostPorts OleData HostMechanisms HostWindows
HostPrinters HostClipboard HostCFrames HostDialog HostCmds
HostMenus HostPictures TextModels TextRulers TextSetters TextViews
TextControllers TextMappers ObxAscii Sum Init
1 Applogo.ico 2 Doclogo.ico 3 SFLogo.ico 4 CFLogo.ico 5 DtyLogo.ico
1 Move.cur 2 Copy.cur 3 Link.cur 4 Pick.cur 5 Stop.cur 6 Hand.cur 7 Table.cur
О дальнейшей конфигурации ВВ, чтоб запускать модуль Sum как приложение, поищите на данном форуме. Я где-то читал, но сейчас ссылки не припомню.

Еще, как вариант, попереставлять $.

Автор:  Albertum [ Воскресенье, 31 Январь, 2010 11:21 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

id_ler
В предложенном Вами решении запускается среда BlackBox.
Очень уж сложный путь для получения простого консольного приложения.
Но если это единичный случай, то такое решение вполне приемлемо.

Автор:  Info21 [ Воскресенье, 31 Январь, 2010 12:54 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Очень уж сложный путь для получения простого консольного приложения.
И не удивительно -- ведь Блэкбокс придуман совсем под другой тип приложений.

Автор:  id_ler [ Воскресенье, 31 Январь, 2010 13:14 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Но если это единичный случай, то такое решение вполне приемлемо.
Если у Вас есть необходимость взаимодействия именно с cmd.exe, тогда придется, возможно, написать модуль для такого взаимодействия(зависит от задачи). Если же собираете консольное приложение «по привычке», как это традиционно принято в других средах, то надо понять, что ВВ – это скорее «среда разработки-операционная система», а не «среда разработки-приложение». Поэтому, уж если нужна консоль, то идеологически-правильным будет запускать ее внутри ВВ. Хотя, это будет использование системозависимых средств, к которым отношение не однозначное.

Автор:  Илья Ермаков [ Воскресенье, 31 Январь, 2010 15:05 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Для работы с консолью тоже не раз выкладывались модули разных авторов... Поискать можно; не найдёте - выложим где-нибудь раз навсегда :)

Автор:  id_ler [ Вторник, 02 Февраль, 2010 09:42 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
В предложенном Вами решении запускается среда BlackBox.
Цитата:
Еще, как вариант, попереставлять $.
Чтобы среда не запускалась в списке линкуемых модулей параметр $ должен стоять после нужного модуля(в данном случае Sum$). Но этого не достаточно для автоматического исполнения процедур при запуске приложения. Секция BEGIN в окончании модуля должна иметь еще что-то, кроме Main. С этим я не разбирался. Кроме того, надо разобраться с импортированием промежуточных модулей(в данном случае ObxAscii). Иногда нужно открывать текст модуля и компилировать его через Ctrl+K.

P.S. Еще я не уверен с положением в списке модуля Init в данном случае.

Автор:  Albertum [ Вторник, 02 Февраль, 2010 10:28 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Как топикстартер подведу итоги:
1. В общем случае, получение исполняемого файла операционной системы Windows (без blackbox.exe) - задача нетривиальная.
2. Для текстового ввода/вывода (в текущий момент времени) удобнее всего использовать модули Info21olimpIn, Info21olimpOut из сборки BlackBox.MGU. В этом случае (если не добавлять сторонние модули) можно быть уверенным в том, что получится корректно работающий exe.

Автор:  Info21 [ Вторник, 02 Февраль, 2010 10:57 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Для текстового ввода/вывода (в текущий момент времени) удобнее всего использовать модули Info21olimpIn, Info21olimpOut
Спасибо за информацию.
Раз они такие удачные вышли, надо их, наверное, в новые сборки повключать, что ли.

Сделал их, кстати, многоуважаемый Trurl.

Автор:  id_ler [ Вторник, 02 Февраль, 2010 11:24 ]
Заголовок сообщения:  Re: Проблема содания exe: illegal memory read при вып-и

Albertum писал(а):
Как топикстартер подведу итоги:
1. В общем случае, получение исполняемого файла операционной системы Windows (без blackbox.exe) - задача нетривиальная.
Для начинающих почти все задачи нетривиальные. А дальше как пойдет...

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/