Win32 консоли и ДОС приложения
От: PAlexander  
Дата: 23.05.03 19:19
Оценка:
Вопрос: Как терминировать дос программу, если TerminateProcess не срабатывает?

Решаемая задача:
Пишу диспетчер взаимодействия с ДОС программами (компилятор Turbo Pascal for dos и программы скомпилированные им). Проблема в том, что эти программы не честно пишут в консоль (т. е. перехват ввода вывода ничего не дает), решение проблемы – диспетчер имеет свою консоль, куда все ДОС используют для ввода/вывода данных. А диспетчер читает все нужные данные со своей консоли.

Проблема:
Все работает за исключение одной вещи:
TerminateProcess не останавливает ДОС приложение, если оно использует мою консоль.

Какие еще кроме TerminateProcess, есть способы остановить дос-программу в windows 98?

Примечание: система разрабатывается на Delphi под windows 98(никаких NT,XP и т. д., там все нормально терминируется). Для запуска ДОС программ используется CreateProcess
Re: Win32 консоли и ДОС приложения
От: FlashBack  
Дата: 26.05.03 20:16
Оценка:
Здравствуйте, PAlexander, Вы писали:


PA>Проблема:

PA>Все работает за исключение одной вещи:
PA>TerminateProcess не останавливает ДОС приложение, если оно использует мою консоль.

А GetLastError после запуска TerminateProcess что говорит(FormatMessage).
Как правило, по сообщению много можно понять
Re: Win32 консоли и ДОС приложения
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.05.03 00:06
Оценка:
Здравствуйте, PAlexander, Вы писали:

PA>Все работает за исключение одной вещи:

PA>TerminateProcess не останавливает ДОС приложение, если оно использует мою консоль.

Насколько мне помниться для работы DOS приложений запускался ещё какой-то exe файл. Может его прибить?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Win32 консоли и ДОС приложения
От: Аноним  
Дата: 30.05.03 07:08
Оценка:
A>Насколько мне помниться для работы DOS приложений запускался ещё какой-то exe файл. Может его прибить?

Уточнение:
Парни это все не то. Я посмотрел, что возвращает функция FormatMessage – «Не правильный идентификатор». Причем сообщение на русском языке (по своему опыту скажу, если сообщение об ошибке на русском языке, то жди проблем - ). На сайте RSDN писали как терминировать виртуальные машины в Windows NT/2000. В этой статье говорится, что TerminateProcess нельзя использовать, поскольку функция CreateProcess возвращает неправильный идентификатор процесса. Я думаю, что в Windows 98 такая же проблема (я уже бьюсь над этим более месяца).

Альтернатива:
В принципе все мои ДОС программы, можно терминировать, нажав кнопку CTRL+BREAK. Нужно с эмулировать нажатие этой комбинации. GenerateConsoleCtrlEvent – не подходит поскольку ДОС программа использует мою консоль.
Re[3]: Win32 консоли и ДОС приложения
От: Кирпа В.А. Украина  
Дата: 30.05.03 07:33
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Парни это все не то. Я посмотрел, что возвращает функция FormatMessage – «Не правильный идентификатор». Причем сообщение на русском языке (по своему опыту скажу, если сообщение об ошибке на русском языке, то жди проблем - ). На сайте RSDN писали как терминировать виртуальные машины в Windows NT/2000. В этой статье говорится, что TerminateProcess нельзя использовать, поскольку функция CreateProcess возвращает неправильный идентификатор процесса. Я думаю, что в Windows 98 такая же проблема (я уже бьюсь над этим более месяца).

Да если сообщение на русском языке и FormatMessage посылает на три буквы то действительно надо ждать проблем
!0xDEAD
Re: Win32 консоли и ДОС приложения
От: free stranger Россия  
Дата: 30.05.03 07:35
Оценка:
Здравствуйте, 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:
CreateProcess(nil,PCHAR(comm),nil,nil,FALSE,NORMAL_PRIORITY_CLASS,nil,
           PCHAR(dir),StartupInfo,ProcessInfo);
   CloseHandle(ProcessInfo.hProcess);
   ProcessInfo.hProcess := 0;
   CloseHandle(ProcessInfo.hThread);
   ProcessInfo.hThread := 0;

Причем при вызове этой команды не создается новое консольное окно, а ДОС программа использует мою консоль. Далее я со своей консоли считываю то, что написала ДОС- программа (на этом все и построено).

Ну вот и терминирующий код
    ProcessInfo.hProcess :=       OpenProcess(PROCESS_TERMINATE,false,ProcessInfo.dwProcessId);
   TerminateProcess(ProcessInfo.hProcess,0);
Re[3]: Win32 консоли и ДОС приложения
От: free stranger Россия  
Дата: 30.05.03 09:38
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Ну вот и терминирующий код

А>
А>    ProcessInfo.hProcess :=       OpenProcess(PROCESS_TERMINATE,false,ProcessInfo.dwProcessId);
А>   TerminateProcess(ProcessInfo.hProcess,0);
А>


Вот, так сказать, выдержка из "Правды"
--------------------
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....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.