Как запустить одну программу из другой

Для запуска дочерней программы служит функция 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), ключевыми компонентами являются:

  1. pipe — Возвращает пару файловых дескрипторов, так что то, что написано в одном, может быть прочитано из другого.
  2. fork — Разветвляет процесс на два, оба продолжают выполнять один и тот же код.
  3. dup2 — Перенумеровывает файловые дескрипторы. При этом вы можете взять один конец канала и превратить его в стандартный вывод или стандартный вывод.
  4. exec — Прекратите запуск текущей программы, запустите другую, в том же процессе.

Объедините их все, и вы получите то, что просили.

Это мое решение, и оно сработало:

#include «stdio.h»int main ()
#include #include int main()< system(«./sum.exe

Источник: web-answers.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru