2009-12-06 9 views
8

Ich schrieb dieses Dienstprogramm (Exe), die aus dieser Host-Anwendung aufgerufen werden kann. Und ich würde es vorziehen, dass das Dienstprogramm nur von der Host-Anwendung aufgerufen werden kann. Wenn Sie es von außen oder von einem anderen Host ausführen, sollte das Dienstprogramm sofort beendet werden.Ermitteln Sie den übergeordneten Prozess der aktuellen App

Gibt es eine Möglichkeit, herauszufinden, welcher Prozess mein Dienstprogramm gestartet hat?

Danke für die Antworten.

+0

Ich habe SysInternals ProcessExplorer, der mir einen Baum aller laufenden Prozesse zeigt und was jeder von gestartet wurde, so dass die Informationen definitiv verfügbar sind. Die Frage ist, wie man darauf zugreifen kann, was ich leider nicht weiß. Ich füge Ihrem Beitrag das "winapi" -Tag hinzu und mache es ein wenig klarer, dass Sie genau danach suchen. –

+0

Beste Antwort, die ich gesehen habe, ist http://stackoverflow.com/a/3346055/647492 –

Antwort

9

können Sie die CreateToolhelp32Snapshot Funktion verwenden, um die laufenden Prozess Liste und dann die Process32First Funktion zum Aufzählen die th32ParentProcessID zu erhalten, die die Kennung des Prozesses ist, dass dieser Prozess erstellt (seine Eltern-Prozess).

Siehe dieses Beispiel.

uses 
    Psapi, 
    Windows, 
    tlhelp32, 
    SysUtils; 

function GetTheParentProcessFileName(): String; 
const 
    BufferSize = 4096; 
var 
    HandleSnapShot : THandle; 
    EntryParentProc : TProcessEntry32; 
    CurrentProcessId: DWORD; 
    HandleParentProc: THandle; 
    ParentProcessId : DWORD; 
    ParentProcessFound : Boolean; 
    ParentProcPath  : String; 

begin 
    ParentProcessFound := False; 
    HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //enumerate the process 
    if HandleSnapShot <> INVALID_HANDLE_VALUE then 
    begin 
    EntryParentProc.dwSize := SizeOf(EntryParentProc); 
    if Process32First(HandleSnapShot, EntryParentProc) then //find the first process 
    begin 
     CurrentProcessId := GetCurrentProcessId(); //get the id of the current process 
     repeat 
     if EntryParentProc.th32ProcessID = CurrentProcessId then 
     begin 
      ParentProcessId := EntryParentProc.th32ParentProcessID; //get the id of the parent process 
      HandleParentProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ParentProcessId); 
      if HandleParentProc <> 0 then 
      begin 
       ParentProcessFound := True; 
       SetLength(ParentProcPath, BufferSize); 
       GetModuleFileNameEx(HandleParentProc, 0, PChar(ParentProcPath),BufferSize); 
       ParentProcPath := PChar(ParentProcPath); 
       CloseHandle(HandleParentProc); 
      end; 
      break; 
     end; 
     until not Process32Next(HandleSnapShot, EntryParentProc); 
    end; 
    CloseHandle(HandleSnapShot); 
    end; 

    if ParentProcessFound then 
    Result := ParentProcPath 
    else 
    Result := ''; 
end; 
+0

Danke RRUZ !!! Genau das, wonach ich gesucht habe. :) – Rick

1

Wenn diese Anwendung nur von innerhalb des Hosts ausgeführt wird, warum nicht einfach die Formulare für die Anwendung in die Hauptanwendung einfügen und sie wie ein anderes Formular aktivieren?

+2

Wir haben diese Host-Anwendung nicht geschrieben. Es gibt nur diese Möglichkeit, eine andere App auszuführen. Ich wusste nur zufällig, wie sie es ausführen. Danke Tim! – Rick

2

Ich würde einen zusätzlichen Parameter hinzufügen, den Sie nur kennen (es kann eine GUID sein), wenn diese GUID nicht Teil der Parameter an Ihr Dienstprogramm übergeben .. Beenden Sie die Anwendung sofort.

+0

Ich war auf diesem Weg. Das Problem besteht darin, dass die Parameter, die an die Dienstprogramme übergeben werden, über den Setup- oder Einstellungsbildschirm der Host-App angezeigt werden können. Und ich kann die Host-App nicht anweisen, irgendwo anders nach einem magischen Schlüssel zu suchen. Danke Gs! – Rick

2

Die schnelle Antwort auf Ihre Frage lautet: "Nun, nein, Sie können nicht verhindern, dass eine Anwendung ausgeführt wird". Wenn es eine ausführbare Datei ist, kann sie ausgeführt werden. Keine Möglichkeit, das zu stoppen.

Und, wenn Sie die Anwendung nicht steuern können (wie Ihre Kommentare zu zeigen scheinen) dann wird Gs ausgezeichneter Vorschlag nicht funktionieren, oder? Sie haben keine Möglichkeit zu kontrollieren, was die App macht, und Sie können nicht kontrollieren, ob die App auf Ihre spezielle Befehlszeile reagiert.

Das ist also eine interessante Situation.

Die einzige Möglichkeit, die ich sehe, ist, den Zugriff auf die EXE insgesamt zu verhindern oder es zumindest schwer zu machen.

Sie können dies tun:

  1. einbetten EXE in Ihrem Host-EXE als Ressource
  2. Wenn die Zeit, um die EXE zu laufen kommt, dann entpacken Sie es TResourceStream mit
  3. schreiben es aus der heraus TResourceStream mit TFileStream
  4. Führen Sie es
  5. Löschen Sie es, wenn Sie fertig sind.

Nicht schön, aber es ist die einzige Möglichkeit, die EXE davon abzuhalten, zu Ihren Bedingungen und nur zu Ihren Bedingungen ausgeführt zu werden.

+3

Es sieht so aus, als ob er fragt, ob es möglich ist, die Identität des Prozesses zu überprüfen, der die App gestartet hat, und dann sofort zu beenden, wenn es falsch ist. Das sollte möglich sein. –

1

Wir verwenden eine ziemlich einfache Technik, die nur ein paar Zeilen Code benötigt. Die Eltern-App und die Dienstprogramm-App verwenden einige gängige GUIID-Zeichenfolgen (im Code) und rufen RegisterWindowMessage auf, um eine Art "Hallo" -Handshake-Protokoll zu erstellen. Wenn die Dienstprogramm-App zum ersten Mal gestartet wird, wird diese Nachricht veröffentlicht. Wenn die übergeordnete App ausgeführt wird und das Dienstprogramm gestartet wurde, wird die Antwortnachricht veröffentlicht, die vom Dienstprogramm angezeigt wird und alles in Ordnung ist. Wenn nicht, wird das Zeitlimit überschritten und das Programm beendet.

+0

Die übergeordnete App muss geändert/neu geschrieben werden, um es so zu implementieren. Ist das korrekt ? – Rick

+0

Ja. Ich habe nicht gesehen, dass eine Drittanbieter-App diejenige war, die das Dienstprogramm ausführte, bis ich das geschrieben hatte. Mein Fehler. –

Verwandte Themen