Вопрос: Как терминировать дос программу, если TerminateProcess не срабатывает?
Решаемая задача:
Пишу диспетчер взаимодействия с ДОС программами (компилятор Turbo Pascal for dos и программы скомпилированные им). Проблема в том, что эти программы не честно пишут в консоль (т. е. перехват ввода вывода ничего не дает), решение проблемы – диспетчер имеет свою консоль, куда все ДОС используют для ввода/вывода данных. А диспетчер читает все нужные данные со своей консоли.
Проблема:
Все работает за исключение одной вещи:
TerminateProcess не останавливает ДОС приложение, если оно использует мою консоль.
Какие еще кроме TerminateProcess, есть способы остановить дос-программу в windows 98?
Примечание: система разрабатывается на Delphi под windows 98(никаких NT,XP и т. д., там все нормально терминируется). Для запуска ДОС программ используется CreateProcess
Здравствуйте, PAlexander, Вы писали:
PA>Все работает за исключение одной вещи: PA>TerminateProcess не останавливает ДОС приложение, если оно использует мою консоль.
Насколько мне помниться для работы DOS приложений запускался ещё какой-то exe файл. Может его прибить?
A>Насколько мне помниться для работы DOS приложений запускался ещё какой-то exe файл. Может его прибить?
Уточнение:
Парни это все не то. Я посмотрел, что возвращает функция FormatMessage – «Не правильный идентификатор». Причем сообщение на русском языке (по своему опыту скажу, если сообщение об ошибке на русском языке, то жди проблем - ). На сайте RSDN писали как терминировать виртуальные машины в Windows NT/2000. В этой статье говорится, что TerminateProcess нельзя использовать, поскольку функция CreateProcess возвращает неправильный идентификатор процесса. Я думаю, что в Windows 98 такая же проблема (я уже бьюсь над этим более месяца).
Альтернатива:
В принципе все мои ДОС программы, можно терминировать, нажав кнопку CTRL+BREAK. Нужно с эмулировать нажатие этой комбинации. GenerateConsoleCtrlEvent – не подходит поскольку ДОС программа использует мою консоль.
Здравствуйте, Аноним, Вы писали: А>Парни это все не то. Я посмотрел, что возвращает функция FormatMessage – «Не правильный идентификатор». Причем сообщение на русском языке (по своему опыту скажу, если сообщение об ошибке на русском языке, то жди проблем - ). На сайте RSDN писали как терминировать виртуальные машины в Windows NT/2000. В этой статье говорится, что TerminateProcess нельзя использовать, поскольку функция CreateProcess возвращает неправильный идентификатор процесса. Я думаю, что в Windows 98 такая же проблема (я уже бьюсь над этим более месяца).
Да если сообщение на русском языке и FormatMessage посылает на три буквы то действительно надо ждать проблем
Здравствуйте, PAlexander, Вы писали:
PA>Вопрос: Как терминировать дос программу, если TerminateProcess не срабатывает?
[cut]
Пришли участок кода, которым ты убиваешь процесс. Иначе непонятно, почему происходит проблема.
З.Ы. А какую "свою" консоль ты используешь?? Эмулируешь через неименованей PIPEs? или как?
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re[2]: Win32 консоли и ДОС приложения
От:
Аноним
Дата:
30.05.03 08:53
Оценка:
PA>>Вопрос: Как терминировать дос программу, если TerminateProcess не срабатывает? FS>Пришли участок кода, которым ты убиваешь процесс. Иначе непонятно, почему происходит проблема. FS>З.Ы. А какую "свою" консоль ты используешь?? Эмулируешь через неименованей PIPEs? или как?
Проблема в том, что мои ДОС программы нечестно выводят в консоль, поэтому перехватив pipe я не получаю их вывод на экран.
Упрощение задачи:
В Visual C++ и Delphi есть возможность создать консольное приложение. В VC используются флаги командной строки компилятора. В Delphi (его я использую в своем проекте) написав приведенный код ниже также создает консоль:
program console1;
{$APPTYPE CONSOLE}begin
end.
Для вызова ДОС программы я использую CreateProcess:
Причем при вызове этой команды не создается новое консольное окно, а ДОС программа использует мою консоль. Далее я со своей консоли считываю то, что написала ДОС- программа (на этом все и построено).
Вот, так сказать, выдержка из "Правды"
--------------------
HANDLE OpenProcess( DWORD fdwAccess,
BOOL fInherit,
DWORD IDProcess);
Parameters:
fdwAccess — Not supported; set to zero.
^^^^^^^^^^^^^^^^^^^^^^^^^^
fInherit — Not supported; set to FALSE.
IDProcess — Specifies the process identifier of the process to open.
--------------------
Поэтому используй просто вызов
TerminateProcess(ProcessInfo.hProcess,0)
Обычно всегда срабатывает. В очень редких случаях необходимо давать завершающему просессу дополнительные права, да и то, дай бог памяти , через AdjustTokenPrivelege (в случае с ExitWindowsEx)
С регардами.
З.Ы. Ну а всётаки, что означает "своя" консоль?? или ты имеешь в виде вызвод не через STDIO?
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....