[Delphi] Jak podrać PID z ShellExecute?

Odpowiedz Nowy wątek
2006-08-31 19:33
Gość
0

Witam.

Uruchamiam norą aplikację przez ShellExecute. I chciałbym zabić po jakimś czasie tę aplikację, ale chciałbym zrobić to poprzez Process ID. Jak pobrać process ID ten aplikacji przy uruchamiamiu, a następnie ją zabić za pomocą tego ID? Proszę o szybką pomoc.

Pozostało 580 znaków

2006-08-31 20:26
Opi
0

Nie idź na około...

Jeśli wiesz jaki program uruchamiasz (znasz jego nazwę/lokalizację), to stąd już prosta droga do zamknięcia procesu, do którego dojdziesz podając lokalizację pliku, który wcześniej uruchomiłeś.

Pozostało 580 znaków

2006-08-31 20:30
0

Pobrać PIDu z ShellExecute się nie da. Poszukaj w FAQ i artykułach tytułów typu "Jak pobrać listę procesów" i "Jak zabić proces znając jego ścieżkę" oraz pokombinuj z kodami, które tam są. Jeśli sobie nie poradzisz, to napisz do mnie, bo napisałem taki programik (ProcessKiller) i mam odpowiednie kody ;)


Pozostało 580 znaków

2006-08-31 22:06
0

Da się uzyskać PID. Tylko że nie z ShellExecute, a z ShellExecuteEx. Ta druga funkcja w określonych warunkach zwraca uchwyt procesu, który uruchomiła. Potem pozostaje tylko pobrać PID procesu o danym uchwycie:

uses
  Windows, SysUtils, ShellApi;
 
function NtQueryInformationProcess(hProcess: DWORD; InfoClass: Integer; ProcessInfo: Pointer; ProcessInfoLen: Integer; ReturnLen: Pointer): Integer; stdcall; external 'ntdll.dll';
 
type
  PROCESS_BASIC_INFORMATION = packed record
    Reserved1: Pointer;
    PebBaseAddress: Pointer;
    Reserved2: array[0..1] of Pointer;
    UniqueProcessId: DWORD;
    Reserved3: Pointer;
  end;
 
var
  shi : TShellExecuteInfo;
  pbi : PROCESS_BASIC_INFORMATION;
 
begin
  FillChar(shi, SizeOf(shi), 0);
  shi.cbSize := SizeOf(shi);
  shi.fMask := SEE_MASK_NOCLOSEPROCESS;
  shi.lpVerb := 'open';
  shi.lpFile := 'DSC01917.JPG';
  shi.nShow := SW_SHOWNORMAL;
  ShellExecuteEx(@shi);
 
  NtQueryInformationProcess(shi.hProcess, 0, @pbi, SizeOf(pbi), nil);
 
  MessageBox(0, PChar(Format('%d', [pbi.UniqueProcessId])), 'ProcessId', MB_ICONINFORMATION);
end.

Ten kawałek kodu zadziała tylko w Windows NT4/2000/XP/2003.


M.O.R.R.I.S.: Mechanical Obedient Replicant Responsible for Infiltration and Sabotage
morris#rarlab*com

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0