Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.23;
Скачать: CL | DM;

Вниз

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

 
Fredericco ©   (2003-08-06 20:23) [0]

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

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


 
ZZ ©   (2003-08-06 20:58) [1]

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


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

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

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. Копирайт неизвестен


 
Fredericco ©   (2003-08-07 10:25) [3]

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;

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


 
Fredericco ©   (2003-08-07 10:30) [4]

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 сек. по часам.


 
ZZ ©   (2003-08-07 11:06) [5]

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


 
clickmaker ©   (2003-08-07 11:19) [6]

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


 
clickmaker ©   (2003-08-07 11:26) [7]

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


 
Fredericco ©   (2003-08-07 11:27) [8]

Да... Где-то у меня в ДНК 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;


 
Fredericco ©   (2003-08-07 11:33) [9]

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


 
Fredericco ©   (2003-08-07 11:36) [10]

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

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



Страницы: 1 вся ветка

Текущий архив: 2003.10.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-74301
TUser
2003-10-13 09:26
2003.10.23
TCheckTreeView


1-74186
Joisy
2003-10-09 09:23
2003.10.23
Редактор pas файлов


1-74266
dream
2003-10-13 10:14
2003.10.23
Много ли занимают памяти дополнительные формы ?


1-74220
Abikos
2003-10-09 17:22
2003.10.23
Ищу бесплатные компоненты для отображения animated gifs


14-74413
vidiv
2003-10-05 09:55
2003.10.23
WWW Прокси с авторизацией с помощью домена...