Для запуска дочерней программы служит функция 4Bh, прерывания 21h.
ES:BX=адрес блока параметров
DS:DX=адрес имени программы в формате ASCIIZ формате
Блок параметров занимает 7 слов:
Первое слово – адрес нового сегмента окружения
Два слова – адрес хвоста программы. Четыре слова – в настоящее время не используются.
Пример. Блок параметров и новое окружение программы.
parmblk dw envseg
cmdtail db 9,’ FILE.TXT’,0Dh
envseg segment ‘ENVIR’
Предварительно, перед запуском новой программы, нужно освободить лишнюю память с помощью функции 4Ah. Данная функция требует указания размера памяти, который занимает родительская программа. Для реального определения размера программы в формате ЕХЕ ее замыкают фиктивным сегментом и применяют команду sub для вычитания из адреса фиктивного сегмента адреса начала программы.
BX=блок в параграфах
ES=сегментный адрес модифицируемого блока
Пример запуска программы.
codesg segment ‘CODE’
Как запустить Файл или Программу от имени Администратора
assume CS: codesg,DS:
mov AX,fict ;адрес
mov BX,ES ;адрес PSP
sub AX,BX ;размер
mov BX,AX ;освобождение
mov BX,offset parmblk
mov DX,offset procname
int 21h ;запуск дочерней
errex: ;ошибка запуска
mov DX,offset mes
datasg segment ‘DATA’
parmblk dw 7 dup (0)
procname db ‘proc.exe’,0
mes db ‘Error . ‘,10,13,’$’
stacksg segment stack ‘STACK’
fict segment ‘FICT’
6.5. Макрокоманды
Макрокоманды позволяют автоматизировать частое обращение к командам, набор которых одинаковый, но выполняются они с различными данными. Формат макрокоманды ассемблера имеет вид:
name macro p1,p2,…,pi
p1,p2,…,pi – формальные параметры команды.
n1,n2,…,ni – фактические значения для команды.
Пример использования макрокоманды:
codesg segment ‘code’
assume cs:codesg,ss: codesg,ds: codesg
getmes macro off ;вывод произвольного сообщения
mov dx,offset mes
getmes dx ;обращение к команде
bufer db 128 dup(0)
mes db ‘Hello World . ‘,0ah,0dh,’$’
Источник: studfile.net
Как запустить одну программу из другой
Добрый день, в общем я бы хотел запустить одну программу из другой. Для этого существует функция WinExec.
Есть небольшой вопрос, для начала, как эта функция работает, и второй вопрос, вернет ли она меня к программе из которой я запустил текущую программу?
Регистрация: 03.01.2011
Сообщений: 2,508
> Для этого существует функция WinExec
неа, для этого уже лет 16 существует CreateProcess()
> вернет ли она меня
вернет ли сразу управление? скорей всего да (речь про WinExec, CreateProcess вернёт сразу же).
«Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего.»
Форумчанин
Регистрация: 08.11.2010
Сообщений: 593
хм пример не могли бы привести?
Форумчанин
Регистрация: 08.11.2010
Сообщений: 593
и данная функция сохранит весь контекст программы из которой запустили?
Регистрация: 03.01.2011
Перенос программы на другой диск. FreeMove
Сообщений: 2,508
> хм пример не могли бы привести?
> и данная функция сохранит весь контекст программы из которой запустили?
если контекст == окружение, то:
«Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего.»
Регистрация: 28.01.2009
Сообщений: 20,999
что значит сохранит контекст?
она запустит процесс и все(либо на паузе либо нет)
можно перенаправить потоки stdin,stdout,stderr.
и еще немного настроек.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Форумчанин
Регистрация: 08.11.2010
Сообщений: 593
хм, тогда еще один вопрос, как мне вывести программу из режима ожидания, если я процесс запускаемой программы буду уничтожать в ней же?
Форумчанин
Регистрация: 08.11.2010
Сообщений: 593
STARTUPINFO cif; ZeroMemory( PROCESS_INFORMATION pi; CreateProcess(«C:\Program Files (x86)\Borland\CBuilder6\Projects\lab_os 3\Project12.exe»,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,pi); Sleep(9000); TerminateProcess(pi.hProcess,NO_ERROR);
если я выполню функцию TermonateProcess в Project12.exe то как мне вывести текущую программу из ожидания?
Регистрация: 28.01.2009
Сообщений: 20,999
а если вы не поставите ожидание, то собственно говоря ваш процесс и не будет ждать завершения
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Регистрация: 28.01.2009
Сообщений: 20,999
если я выполню функцию TermonateProcess в Project12.exe то как мне вывести текущую программу из ожидания? |
не очень ожидание.
у вас в pi есть хендл процесса(который кстати надо закрыть потом, так же как и потока)
по нему и ждите через WaitForSingleObject
если она вернет WAIT_TIMEOUT значит процесс еще не завершился
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Источник: www.programmersforum.ru
Как запустить программу из другой программы и передать ей данные через стандартный ввод в c или c ++?
Я хотел знать, как можно запустить эту программу из другой программы на языке c / c ++ и передать ввод через stdin, как это делается на сайтах онлайн-компиляторов, таких как ideone, где я набираю код и предоставляю данные stdin в текстовом поле, и эти данные принимаются программа, использующая scanf или cin. Кроме того, я хотел знать, есть ли способ прочитать вывод этой программы из исходной программы, которая ее запустила.
Решение
Как это сделать, зависит от платформы.
Под Linux / Unix вы можете использовать dup() / dup2()
Один простой способ сделать это — использовать терминал (например, командную строку в windows) и использовать | перенаправить ввод / вывод.
program1 | program2
Это перенаправит вывод программы1 на вход программы2.
Чтобы получить / ввести дату, вы можете использовать временные файлы. Если вы не хотите использовать временные файлы, вам придется использовать трубу.
Для Windows (используйте командную строку):
program1 output
Для Linux вы можете использовать tee утилиту, вы можете найти подробную инструкцию, набрав man tee в терминале Linux
Другие решения
Я знаю, что для этого проще всего использовать popen() функция. Работает в Windows и UNIX. С другой стороны, popen() позволяет только однонаправленное общение.
Например, чтобы передать информацию sum.exe (хотя вы не сможете прочитать результат), вы можете сделать это:
#include #include int main() < FILE *f; f = popen («sum.exe», «w»); if (!f) < perror («popen»); exit(1); >printf («Sending 3 and 4 to sum.exe. n»); fprintf (f, «%dn%dn», 3, 4); pclose (f); return 0; >
В C на платформах, чье имя оканчивается на X (т.е. не Windows), ключевыми компонентами являются:
- pipe — Возвращает пару файловых дескрипторов, так что то, что написано в одном, может быть прочитано из другого.
- fork — Разветвляет процесс на два, оба продолжают выполнять один и тот же код.
- dup2 — Перенумеровывает файловые дескрипторы. При этом вы можете взять один конец канала и превратить его в стандартный вывод или стандартный вывод.
- exec — Прекратите запуск текущей программы, запустите другую, в том же процессе.
Объедините их все, и вы получите то, что просили.
Это мое решение, и оно сработало:
#include «stdio.h»int main ()
#include #include int main()< system(«./sum.exe
Источник: web-answers.ru