Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Диалоговое окно


Nimbus ©   (2002-04-30 23:08:00) 

Знатоки Delphi, подскажите, plz:
посылаю сообщение DOS приложению, работающему в оконном режиме:
PostMessage(hWnd,WM_CLOSE,0,0)
после этого "вылазит" это диалоговое окно "End Program - "имя"", в котором можно выбрать: "End now" или "Cancel"
ПРИМЕЧАНИЕ: приложение запускаю функцией CreateProcess(), причём оно работает в собственной NTVDM и если вместо PostMessage(hWnd,WM_CLOSE,0,0) сделать TerminateProcess(), то я убиваю ТОЛЬКО cmd.exe процесс, а NTVDM остается запущенной вместе с DOS приложением (Norton Commander, DOS Navigator и т.п.).
Как же всё-таки завершить подобные приложения, чтобы они не задавали "лишних вопросов"?????? Заранее благодарен.
Кстати, в NT4.0 после следующего кода:
PostMessage(hWnd,WM_CLOSE,0,0);
PostMessage(hWnd,WM_QUIT,0,0);
подобные приложения убивались без проблем!!??


Nimbus   (2002-05-01 20:38:00) [1]

Спасибо, Rush!

Но это не совсем ответ на мой вопрос.... Если последовать твоему совету, то (в Win2k, по крайней мере) NTVDM продолжит свою работу вместе с DOS Navigator"ом (Norton Commander"ом или т.п.), а убивается ТОЛЬКО "cmd.exe"!!! В принципе, можно убить и процесс NTVDM, зная его дескриптор - hProcess (это тоже не проблема), но как узнать, что это NTVDM, созданная ИМЕННО моим CreateProcess(), потому что их может "висеть" в памяти 2..3..5..10!!??? А чтобы не обьяснять это на пальцах всё-таки приведу пример своего кода - попробуй и узнаешь, что в данном примере TerminateProcess НЕ ВАРИАНТ!!!!!

var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.lpTitle := PChar("Norton Commander");
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_NORMAL;
if CreateProcess(nil,PChar("nc.exe"),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,
StartupInfo,ProcessInfo) then
begin
//....
//....произвожу некоторые действия
//....
WaitforSingleObject(ProcessInfo.hProcess,60000); //ждём 60 секунд
TerminateProcess(ProcessInfo.hProcess,0);
CloseHandle(ProcessInfo.hProcess);
end
end

Если есть другие идеи, буду ОЧЕНЬ ПРИЗНАТЕЛЕН!


Rush   (2002-05-01 16:20:00) [2]


CreateProcess(..., pi );

Zzzzzz....

TerminateProcess( pi.hProcess )
CloseHandle(pi.hProcess)

А если там чего и остаётся - не обращай внимания :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо