Avatar billede thehollow Nybegynder
29. oktober 2001 - 14:42 Der er 17 kommentarer og
2 løsninger

PID ved ShellExecute

Er det en måte å få tak i PID-nummeret når en starter et program med ShellExecute?

Hvis ikke: Hvordan kan man starte et program OG få tak i PID?

Hvordan får man Delphi til å vite når programmet jeg opprettet med ShellExecute blir lukket?

Hilsen en som er fra Norge :)
Avatar billede borrisholt Novice
29. oktober 2001 - 14:46 #1
Nej du skal bruge CreateProcess ..... På Http://borrisholt.com kan du finde et eksempel på hvordan du exekverer et program og venter til det aflsutter ..

Jens B
Avatar billede ziron Nybegynder
29. oktober 2001 - 14:47 #2
Avatar billede pellelil Nybegynder
29. oktober 2001 - 14:48 #3
JCL (Jedi Code Library) har i uniten \"JclSysInfo\" en funktion der hedder: \"GetPidFromProcessName\".

<SNIP>
function RunningProcessesList(const List: TStrings; FullPath: Boolean): Boolean;

  function ProcessFileName(PID: DWORD): string;
  var
    Handle: THandle;
  begin
    Result := \'\';
    Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
    if Handle <> 0 then
    try
      SetLength(Result, MAX_PATH);
      if FullPath then
      begin
        if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
          StrResetLength(Result)
        else
          Result := \'\';
      end
      else
      begin
        if GetModuleBaseNameA(Handle, 0, PChar(Result), MAX_PATH) > 0 then
          StrResetLength(Result)
        else
          Result := \'\';
      end;
    finally
      CloseHandle(Handle);
    end;
  end;

  function BuildListTH: Boolean;
  var
    SnapProcHandle: THandle;
    ProcEntry: TProcessEntry32;
    NextProc: Boolean;
    FileName: string;
  begin
    SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    Result := (SnapProcHandle <> INVALID_HANDLE_VALUE);
    if Result then
    try
      ProcEntry.dwSize := SizeOf(ProcEntry);
      NextProc := Process32First(SnapProcHandle, ProcEntry);
      while NextProc do
      begin
        if ProcEntry.th32ProcessID = 0 then
        begin
          // PID 0 is always the \"System Idle Process\" but this name cannot be
          // retrieved from the system and has to be fabricated.
          FileName := RsSystemIdleProcess;
        end
        else
        begin
          if IsWin2k then
          begin
            FileName := ProcessFileName(ProcEntry.th32ProcessID);
            if FileName = \'\' then FileName := ProcEntry.szExeFile;
          end
          else
          begin
            FileName := ProcEntry.szExeFile;
            if not FullPath then FileName := ExtractFileName(FileName);
          end;
        end;
        List.AddObject(FileName, Pointer(ProcEntry.th32ProcessID));
        NextProc := Process32Next(SnapProcHandle, ProcEntry);
      end;
    finally
      CloseHandle(SnapProcHandle);
    end;
  end;

  function BuildListPS: Boolean;
  var
    PIDs: array [0..1024] of DWORD;
    Needed: DWORD;
    I: Integer;
    FileName: string;
  begin
    Result := EnumProcesses(@PIDs, SizeOf(PIDs), Needed);
    if Result then
    begin
      for I := 0 to (Needed div SizeOf(DWORD)) - 1 do
      begin
        case PIDs[I] of
          0:
            // PID 0 is always the \"System Idle Process\" but this name cannot be
            // retrieved from the system and has to be fabricated.
            FileName := RsSystemIdleProcess;
          2:
            // On NT 4 PID 2 is the \"System Process\" but this name cannot be
            // retrieved from the system and has to be fabricated.
            if IsWinNT4 then
              FileName := RsSystemProcess
            else
              FileName := ProcessFileName(PIDs[I]);
          8:
            // On Win2K PID 8 is the \"System Process\" but this name cannot be
            // retrieved from the system and has to be fabricated.
            if IsWin2K then
              FileName := RsSystemProcess
            else
              FileName := ProcessFileName(PIDs[I]);
        else
          FileName := ProcessFileName(PIDs[I]);
        end;
        if FileName <> \'\' then List.AddObject(FileName, Pointer(PIDs[I]));
      end;
    end;
  end;

begin
  if GetWindowsVersion in [wvWinNT3, wvWinNT4] then
    Result := BuildListPS
  else
    Result := BuildListTH;
end;

function GetPidFromProcessName(const ProcessName: string): DWORD;
var
  List: TStringList;
  I: Integer;
begin
  Result := INVALID_HANDLE_VALUE;
  List := TStringList.Create;
  try
    if RunningProcessesList(List, True) then
    begin
      I := List.IndexOf(ProcessName);
      if I > -1 then
        Result := DWORD(List.Objects[I]);
    end;
  finally
    List.Free;
  end;
end;
</SNIP>

Jeg skal umiddelbart ikke sige om du her har \"hele sourcen\" eller om den stadig \"kræver noget\". Hvis dette er tilfældet så hent (og kig på) JCL: http://www.delphi-jedi.org/Jedi:CODELIBJCL:58115
Avatar billede ziron Nybegynder
29. oktober 2001 - 14:48 #4
når så kan det hele også være lige meget, sover du aldrig jens???

/ZIRON
Avatar billede thehollow Nybegynder
29. oktober 2001 - 14:50 #5
WOW!!! Takk for super-rask respons!!!
Avatar billede borrisholt Novice
29. oktober 2001 - 14:50 #6
ziron >> jo en gang i mellem ... Men helst ikke når du er på eksperten ....

Jens B
Avatar billede ziron Nybegynder
29. oktober 2001 - 14:52 #7
borrisholt >> arrr okay så må det være derfor at jeg aldrig har oplevet det. men sov godt for jeg hopper af nu, gider sku ikke det lort mere. går over i hjørnet og grader :-)

/ZIRON
Avatar billede borrisholt Novice
29. oktober 2001 - 14:52 #8
thehollow  >> det er trods alt i Delphi gruppen du har spurgt :-)

Og så behøves du jo ikke at vente på ziron :-)

Jens B
Avatar billede ziron Nybegynder
29. oktober 2001 - 14:54 #9
jens du hygger dig nok rigtig har du lige fået løn forhøjelse???

/ZIRON
Avatar billede borrisholt Novice
29. oktober 2001 - 14:55 #10
Faktisk ja .....

Jens B
Avatar billede ziron Nybegynder
29. oktober 2001 - 14:57 #11
hmmmm så kan jeg sku bedre forstå du er på den måde :-)

/ZIRON
Avatar billede ziron Nybegynder
29. oktober 2001 - 14:59 #12
så kan DU lærer det jens :-)

men okay jeg vil gerne dele point med dig...

/ZIRON
Avatar billede borrisholt Novice
29. oktober 2001 - 15:03 #13
Jeg lever sq nok uden ... Hvis jeg ikke havde nogen at drille så vare det jo ikke så sjovt at være herinde på Eksperten !

Jens B
Avatar billede ziron Nybegynder
29. oktober 2001 - 15:05 #14
hehe men nej du SKAL have dem... hvorfor kan man ikke give ½ point, det er for dårligt...

men må ikke drille dem som er yngre end en selv...

/ZIRON
Avatar billede ziron Nybegynder
29. oktober 2001 - 15:06 #15
Avatar billede thehollow Nybegynder
29. oktober 2001 - 15:08 #16
>> Ziron

ExecuteAndWait fungerte som jeg ønsket :)
Flott program!
Avatar billede ziron Nybegynder
29. oktober 2001 - 15:09 #17
thehollow >> jeg takker mange gange :-)
men jeg tror nu at det er borrisholt du skal sige tak til, men jeg er sku god til det der copy and paste ik :-)

/ZIRON
Avatar billede thehollow Nybegynder
29. oktober 2001 - 15:12 #18
>> Ziron

Copy & paste = ok
Takk begge to :)
Avatar billede ziron Nybegynder
29. oktober 2001 - 15:13 #19
thehollow >> det var så lidt...

/ZIRON
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester