Главная страница
    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.47 MB
Время: 0.009 c
6-74339
ilka
2003-08-27 19:13
2003.10.23
проблема в TIdPop3


1-74116
zmei
2003-10-10 20:38
2003.10.23
Формы


14-74386
ORMADA
2003-10-01 12:35
2003.10.23
DCU


7-74510
suric
2003-08-06 14:26
2003.10.23
Программирование USB под Win32


7-74513
Supra
2003-08-05 03:44
2003.10.23
Как просканирвать шину PCI?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский