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

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

Корректное закрытие приложения, зная hProcess.


Fredericco ©   (2003-08-06 20:23:00) 

Есть моя программа, которая открывает другие мои программы через CreateProcess. Соответственно знаю для каждого приложения его _PROCESS_INFORMATION. А вот закрыть приложение корректно не получается.
Пробывал:
1) TerminateProcess - убийство процесса (( ;
2) PostThreadMessage - пробывал WM_CLOSE, WM_QUIT, WM_DESTROY : ничего не срабатывает ;
3) CloseHandle - тоже ничего не происходит.

В приложениях на событиях OnCloseQuery, OnClose, OnDestroy ничего нет.
Не подскажите как правильно закрыть приложение, как по WM_CLOSE.
Заранее благодарен,
С Уважением Fredericco.


Fredericco   (2003-08-07 11:36:00) [1]

2 clickmaker © (07.08.03 11:26)
Я вру! С одним приложением фигово, зато с другими все ОК!
Буду искать у себя ошибку...

Всем спасибо за помощь!


Fredericco   (2003-08-07 11:33:00) [2]

2 clickmaker © (07.08.03 11:26)
У меня эффект такой же как и от TerminateProcess :-(((((


Fredericco   (2003-08-07 11:27:00) [3]

Да... Где-то у меня в ДНК error.
Вот такой вриводит к ошибке Range Check Error:

procedure TForm1.Button1Click(Sender: TObject);
var
d:DWORD;
begin
tmCheck.Enabled:=False;
d:=App_CM_D[0].dwProcessId;
NTKillProcess(d);
end;


function NTKillProcess(iProcessID: DWord): Integer;
var
hProcess: Integer;
pfnExitProcess: Pointer;
hInstance: Integer;
hThread: DWORD;
begin
Result:=ERROR_SUCCESS ;// Здесь ставлю BreakPoint

hProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, iProcessID);

if hProcess > 0 then begin
hInstance:=GetModuleHandle("KERNEL32.DLL"); // Здесь высыпаюсь
pfnExitProcess:=GetProcAddress(hInstance, "ExitProcess");
hThread:=CreateRemoteThread(hProcess, nil, 0, pfnExitProcess, nil, 0,hThread);
if hThread>0 then begin
WaitForSingleObject(hThread, 40000);
( hThread)

Да... Где-то у меня в ДНК error.
Вот такой вриводит к ошибке Range Check Error:

procedure TForm1.Button1Click(Sender: TObject);
var
d:DWORD;
begin
tmCheck.Enabled:=False;
d:=App_CM_D[0].dwProcessId;
NTKillProcess(d);
end;


function NTKillProcess(iProcessID: DWord): Integer;
var
hProcess: Integer;
pfnExitProcess: Pointer;
hInstance: Integer;
hThread: DWORD;
begin
Result:=ERROR_SUCCESS ;// Здесь ставлю BreakPoint

hProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, iProcessID);

if hProcess > 0 then begin
hInstance:=GetModuleHandle("KERNEL32.DLL"); // Здесь высыпаюсь
pfnExitProcess:=GetProcAddress(hInstance, "ExitProcess");
hThread:=CreateRemoteThread(hProcess, nil, 0, pfnExitProcess, nil, 0,hThread);
if hThread>0 then begin
WaitForSingleObject(hThread, 40000);
if not CloseHandle(hThread) then Result:=GetLastError;
end else Result:=GetLastError;
CloseHandle(hProcess);
end else Result:=GetLastError;
end;


clickmaker   (2003-08-07 11:26:00) [4]

Вернее так:
PostThreadMessage(App_CM_D[Num].dwThreadId,WM_QUIT,0,0);


clickmaker   (2003-08-07 11:19:00) [5]

PostThreadMessage(App_CM_D[Num]. dwThreadId,WM_CLOSE,0,0);


ZZ   (2003-08-07 11:06:00) [6]

Не знаю, не знаю, но NTKillProcess просто обязана работать - думаю за год ничего не изменилось :) правда должна работать для Win32,а для всяких DOS прог не проверял.. Посмотри какая функция возвращает ошибку? и что за ошибка


Fredericco   (2003-08-07 10:30:00) [7]

2 kostik78ua (07.08.03 09:25)
Вот такой код:
procedure TForm1.Button1Click(Sender: TObject);
var
pfnExitProcess: Pointer;
hThread: DWORD;
hProcess:Integer;

begin
hProcess:=App_CM_D[1].hProcess;
hInstance:=GetModuleHandle("KERNEL32.DLL");
pfnExitProcess:=GetProcAddress(hInstance, "ExitProcess");
hThread:=CreateRemoteThread(hProcess, nil, 0, pfnExitProcess, nil, 0,hThread);
if hThread>0 then begin
WaitForSingleObject(hThread, 40000);
( hThread)

2 kostik78ua (07.08.03 09:25)
Вот такой код:
procedure TForm1.Button1Click(Sender: TObject);
var
pfnExitProcess: Pointer;
hThread: DWORD;
hProcess:Integer;

begin
hProcess:=App_CM_D[1].hProcess;
hInstance:=GetModuleHandle("KERNEL32.DLL");
pfnExitProcess:=GetProcAddress(hInstance, "ExitProcess");
hThread:=CreateRemoteThread(hProcess, nil, 0, pfnExitProcess, nil, 0,hThread);
if hThread>0 then begin
WaitForSingleObject(hThread, 40000);
CloseHandle(hThread);
end;
CloseHandle(hProcess);
end;

Не работает... Ждал 40 сек. по часам.


Fredericco   (2003-08-07 10:25:00) [8]

2 ZZ © (06.08.03 20:58)
Чего же не показать.

var
app_CM_D : array of TProcessInformation;
.................
procedure CloseMyApp(Num:integer);
begin
PostThreadMessage(App_CM_D[Num].hThread,WM_CLOSE,0,0);
// PostThreadMessage(App_CM_D[Num].hProcess,WM_CLOSE,0,0);
end;

И не закрывается.


kostik78ua   (2003-08-07 09:25:00) [9]

Попробуй функцию:

function NTKillProcess(iProcessID: Integer): Integer;
var
hProcess: Integer;
pfnExitProcess: Pointer;
hInstance: Integer;
hThread: DWORD;
begin
Result:=ERROR_SUCCESS;

hProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, iProcessID);

if hProcess > 0 then begin
hInstance:=GetModuleHandle("KERNEL32.DLL");
pfnExitProcess:=GetProcAddress(hInstance, "ExitProcess");
hThread:=CreateRemoteThread(hProcess, nil, 0, pfnExitProcess, nil, 0,hThread);
if hThread>0 then begin
WaitForSingleObject(hThread, 40000);
if not CloseHandle(hThread) then Result:=GetLastError;
end else Result:=GetLastError;
( hProcess)

Попробуй функцию:

function NTKillProcess(iProcessID: Integer): Integer;
var
hProcess: Integer;
pfnExitProcess: Pointer;
hInstance: Integer;
hThread: DWORD;
begin
Result:=ERROR_SUCCESS;

hProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, iProcessID);

if hProcess > 0 then begin
hInstance:=GetModuleHandle("KERNEL32.DLL");
pfnExitProcess:=GetProcAddress(hInstance, "ExitProcess");
hThread:=CreateRemoteThread(hProcess, nil, 0, pfnExitProcess, nil, 0,hThread);
if hThread>0 then begin
WaitForSingleObject(hThread, 40000);
if not CloseHandle(hThread) then Result:=GetLastError;
end else Result:=GetLastError;
CloseHandle(hProcess);
end else Result:=GetLastError;
end;

Как вместо ProcessID использовать hProcess думаю догадаешься :)

P.S. Копирайт неизвестен


ZZ   (2003-08-06 20:58:00) [10]

использовать WM_CLOSE :)
А вот как ты его неправильно использовал ты наверное покажешь?


Наверх

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