Написание резидентной программы для DOS
Участников: 3
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Написание резидентной программы для DOS
Вот потребовалось написать резидентную программу для DOS, а не знаю как. Я её запускаю из другой программы1 с GUI, и она запускается в фоне изначально, но вернуться к работе с программой1 не могу.
Нужно, чтобы она запустилась и осталась выполняться в фоне. Искал на оф форуме, но ничего не нашел.
Да, вот еще нашел функцию DPMI:
__dpmi_terminate_and_stay_resident ( byval return_code as integer, byval paragraphs_to_keep as integer ) as integer
Только непонятно, какие параметры её нужны.
Нужно, чтобы она запустилась и осталась выполняться в фоне. Искал на оф форуме, но ничего не нашел.
Да, вот еще нашел функцию 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
Alexey, хочу тебя немного огорчить, резидентная программа должна обязательно работать в реальном режиме, это могут только 16-юитные программы, а FB является 32-х разрядным. И при всем при этом резидентная программа не может использовать функции, которые используют прерывания (так как сама работает в прерывании), следовательно никакие функции работы с внешним миром будут недоступны. Те получается что эти функции придется писать в основном ассемблерными вставками, работая напрямую с адресным пространством, и компилить прогу придется на as-е в 16-битное приложение, правда даже не представляю че из етого получится. Я такое писал на какомто борландовском Си-шном компиляторе, помоему 2.0, но всеравно, основную часть писал ассемблерными вставками (правда в етом компиляторе много низкоуровневых функций, которые работают независимо от ОС). Так что вот... лучше ето написать на чем то древнем, или на чистом асме, разница невелика
Re: Написание резидентной программы для DOS
http://www.freebasic.net/forum/viewtopic.php?t=3285&postdays=0&postorder=asc&start=0
Вот на официальном форуме ссылка на тему, в которой решили и проблему с многозадачностью, и с многопоточностью в DOS. Только ссылки на библиотеки уже все битые
Нет ли у кого-нибудь из обитателей форума файлов fbthread.exe, fbos001.rar. Они раньше на fbide.freebasic.net лежали.
А я если на C++ напишу, то программа не будет иметь ограничения на 1мб RAM, когда DPMI запущен?
Вот на официальном форуме ссылка на тему, в которой решили и проблему с многозадачностью, и с многопоточностью в DOS. Только ссылки на библиотеки уже все битые
Нет ли у кого-нибудь из обитателей форума файлов fbthread.exe, fbos001.rar. Они раньше на fbide.freebasic.net лежали.
А я если на C++ напишу, то программа не будет иметь ограничения на 1мб RAM, когда DPMI запущен?
Alexey- Сообщения : 7
Дата регистрации : 2009-05-19
Re: Написание резидентной программы для DOS
В голову взбрело 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 <адрес>. Тебе осталось только вычислить этот самый адрес
A!!! Есть еще прерывание досовское int 0x27 - "завершится, но остаться резидентным". Поищи таблицы прерываний. А хотя из fb прерываний все равно не вызвать...
P.S. В асме гораздо проще, написал Org 7c00h - и знаешь что программа в этом адресе находится в памяти. А в FB - х\з. Тем более что компилирует он в формат MZ.
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 <адрес>. Тебе осталось только вычислить этот самый адрес
A!!! Есть еще прерывание досовское int 0x27 - "завершится, но остаться резидентным". Поищи таблицы прерываний. А хотя из fb прерываний все равно не вызвать...
P.S. В асме гораздо проще, написал Org 7c00h - и знаешь что программа в этом адресе находится в памяти. А в FB - х\з. Тем более что компилирует он в формат MZ.
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Re: Написание резидентной программы для DOS
Дааа, лучше писать на С++. Спасибо за инфу. Кстати больше подойдет 31h - там нет ограничения на размер приложения в 64кб. Но тут возникает один вопрос: При запущенном DPMI 16 битное приложение не имеет ограничения в 1мб RAM? Просто тут довольно крупный проект, которому 1мб не хватит.
Alexey- Сообщения : 7
Дата регистрации : 2009-05-19
Re: Написание резидентной программы для DOS
Ну я как-то писал дос-программу, которая вместе с ресурсами в распакованном виде занимала в RAM под 2 мб, один файл мог быть и 1,5мб если это тебя утешит...
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|