Текущий архив: 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