Написание резидентной программы для DOS

Предыдущая тема Следующая тема Перейти вниз

Написание резидентной программы для DOS

Сообщение  Alexey в Вс Май 31, 2009 5:56 pm

Вот потребовалось написать резидентную программу для DOS, а не знаю как. Я её запускаю из другой программы1 с GUI, и она запускается в фоне изначально, но вернуться к работе с программой1 не могу.
Нужно, чтобы она запустилась и осталась выполняться в фоне. Искал на оф форуме, но ничего не нашел.

Да, вот еще нашел функцию DPMI:
__dpmi_terminate_and_stay_resident ( byval return_code as integer, byval paragraphs_to_keep as integer ) as integer
Только непонятно, какие параметры её нужны.

Alexey

Сообщения : 7
Дата регистрации : 2009-05-19

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Написание резидентной программы для DOS

Сообщение  tux в Пн Июн 01, 2009 1:27 pm

Alexey, хочу тебя немного огорчить, резидентная программа должна обязательно работать в реальном режиме, это могут только 16-юитные программы, а FB является 32-х разрядным. И при всем при этом резидентная программа не может использовать функции, которые используют прерывания (так как сама работает в прерывании), следовательно никакие функции работы с внешним миром будут недоступны. Те получается что эти функции придется писать в основном ассемблерными вставками, работая напрямую с адресным пространством, и компилить прогу придется на as-е в 16-битное приложение, правда даже не представляю че из етого получится. Я такое писал на какомто борландовском Си-шном компиляторе, помоему 2.0, но всеравно, основную часть писал ассемблерными вставками (правда в етом компиляторе много низкоуровневых функций, которые работают независимо от ОС). Так что вот... лучше ето написать на чем то древнем, или на чистом асме, разница невелика
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Написание резидентной программы для DOS

Сообщение  Alexey в Пн Июн 01, 2009 6:51 pm

http://www.freebasic.net/forum/viewtopic.php?t=3285&postdays=0&postorder=asc&start=0
Вот на официальном форуме ссылка на тему, в которой решили и проблему с многозадачностью, и с многопоточностью в DOS. Только ссылки на библиотеки уже все битые No
Нет ли у кого-нибудь из обитателей форума файлов fbthread.exe, fbos001.rar. Они раньше на fbide.freebasic.net лежали.
А я если на C++ напишу, то программа не будет иметь ограничения на 1мб RAM, когда DPMI запущен?

Alexey

Сообщения : 7
Дата регистрации : 2009-05-19

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Написание резидентной программы для DOS

Сообщение  Andrew в Пн Июн 01, 2009 7:22 pm

В голову взбрело 2 способа. Один ну ооочень уж очевидный, второй посложнее.

1) Создание батника.
При запуске программы, открывается .bat файл, в котором написано примерно следующее
[code]
A:/Progs/Prog2.exe ; Запуск программы из-под той, в которой находишся
A:/Progs/Prog1.exe ; Возврат

Самое главное это то, что Prog1.exe не запустится до тех пор, пока не завершится Prog2.exe

Еще один главный момент!
Писать в батник надо полные пути. Определить их легко.
GetCurDir$, так по моему?

Ну для этих целей лучше создать отдельную "системную" папку Temp. Туда записываешь только что сделанный файл .bat, потом его программно запускаешь как приложение, и от тебе счастье.

2) Трюки с ассемблером.
Полюбому выполняемая программа сидит в памяти. Она должна начинаться с какого-то адреса. С какого? Ну это даже разработчик не знает... Тем не менее... На ассемблере это было бы очень просто, если знать с какого адреса начинаются программы. Ну если тебе поможет - то я знаю только адрес COM файлов - смещение от нулевого - 0x100. А EXE - х\з. Хотя если вспомнить что в exe есть заголовок, и он занимает к примеру 512байт, то 256 (это 0х100) + 512 = нужный адрес ?? Ну это только предположения..

В общем, что хотел сказать:
У нас есть уже запущенная программа. Нам надо запустить другую, а при выходе запустить ту что была раньше.
1) Загружаем программу в память по адресу (к примеру) 7с00h
2) Выходим из существующей программы, запускаем приложение (СОМ) написанное на асме. Оно в свою очередь просто передает управление на адрес (просто JMP 7c00h).
А вот при завершении и возврате в исходную программу, в конце этой программы пишем JMP <адрес>. Тебе осталось только вычислить этот самый адрес Smile

A!!! Есть еще прерывание досовское int 0x27 - "завершится, но остаться резидентным". Поищи таблицы прерываний. А хотя из fb прерываний все равно не вызвать...


P.S. В асме гораздо проще, написал Org 7c00h - и знаешь что программа в этом адресе находится в памяти. А в FB - х\з. Тем более что компилирует он в формат MZ.

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 29
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Написание резидентной программы для DOS

Сообщение  Alexey в Пн Июн 01, 2009 7:45 pm

Дааа, лучше писать на С++. Спасибо за инфу. Кстати больше подойдет 31h - там нет ограничения на размер приложения в 64кб. Но тут возникает один вопрос: При запущенном DPMI 16 битное приложение не имеет ограничения в 1мб RAM? Просто тут довольно крупный проект, которому 1мб не хватит.

Alexey

Сообщения : 7
Дата регистрации : 2009-05-19

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Написание резидентной программы для DOS

Сообщение  Andrew в Пн Июн 01, 2009 9:51 pm

Ну я как-то писал дос-программу, которая вместе с ресурсами в распакованном виде занимала в RAM под 2 мб, один файл мог быть и 1,5мб если это тебя утешит...

Andrew

Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 29
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Написание резидентной программы для DOS

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения