Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ALLE Instanzen eines Programms (auch eingebettete Objekte) (https://www.delphipraxis.net/3802-alle-instanzen-eines-programms-auch-eingebettete-objekte.html)

APP 31. Mär 2003 09:46


ALLE Instanzen eines Programms (auch eingebettete Objekte)
 
Hallo,
ich möchte sichergehen, dass alle laufenden Instanzen z.B. von MS Excel
gefunden und nacheinander angezeigt werden.

Das Suchen und Zeigen von "alleinstehenden" Applikationen geht ja noch:
Delphi-Quellcode:
ahandle := FindWindow(pchar('XLMAIN'), NIL);
IF aHandle <> 0 THEN ShowWindow(aHandle, SW_SHOWNORMAL);
Aber wenn der IE-Explorer ein eingebettetes EXCEL-Fenster besitzt scheitere ich,
da obige Funktion nur ein EXCEL-Fenster zeigt und nicht den IE-Explorer in den Vordergrund bringt.
Delphi-Quellcode:
ahandle := GetAncestor(aHandle,GA_ROOTOWNER);
bzw.
ahandle :=GetParent(aHandle);
funktionieren auch nicht.

Wie kann ich nun den IE-Explorer in den Vordergrund bringen, wenn ein EXCEL-Objekt darin gefunden wurde?
(Am liebsten mit WIN-API Funktionen, nicht mit DDE oder COM,...)

Chewie 31. Mär 2003 10:55

Du musst einfach herausfinden, ob der Prozess EXCEL.EXE läuft. Wie das geht, findest du in der Suche.

APP 31. Mär 2003 12:02

@Chewie,
Zitat:

Du musst einfach herausfinden, ob der Prozess EXCEL.EXE läuft. Wie das geht, findest du in der Suche.
beantwortet meine Frage nicht, sie lautet
Zitat:

Wie kann ich nun den IE-Explorer in den Vordergrund bringen, wenn ein EXCEL-Objekt darin gefunden wurde?
(Am liebsten mit WIN-API Funktionen, nicht mit DDE oder COM,...)
D.h. Im Internet-Explorer ist ein Excel-Fenster eingebettet! (siehe ebenfalls oben)

Wie ich Excel finde, beschreibe ich ebenfalls oben.

Chewie 31. Mär 2003 12:11

OK, wahrscheinlich wird ein Embedded Process im IE nicht durch EXCEL.EXE erzeugt, sondern es wird wohl ein Modul (wahrscheinlich eine DLL geladen). Wenn du rausfindest, wie diese heißt, kannst über einen SnapShot und mit den Funktionen Module32First und Module32Next das Modul finden, falls es läuft.
Dort sollte auch die Prozess-ID oder vielleicht das Fenster-Handle des Prozesses sein, das das Modul geladen hat.

APP 31. Mär 2003 15:14

@Chewie,

ich muß gestehen ich verstehe nicht alles was Du mir sagen möchtest, ich habe im PSDK nachgeschaut, es wird nicht besser.
Zuguterletzt habe ich deine Function Alle Threads einer laufenden Anwendung ermitteln per Cut&Paste gestartet, nunja ich bekomme nun die PID's (?) des Programmes das ich zuvor mit vollem Pfad an GetThreadID übergeben habe.


Mein Problem ist aber, dass ich nicht weiß welche Programme sich im IE eingebettet haben (Word, Excel, AcrobatReader), man kann z.B. in den Einstellungen vom AcrobatReader festlegen, ob dieser sich in den Browser integrieren soll oder nicht.

Daher möchte ich nur wissen, falls das Programm im IE eingebettet ist, dann den IE zeigen, sonst das Programmfenster zeigen.

Chewie 31. Mär 2003 19:56

Zitat:

Zitat von APP
@Chewie,

ich muß gestehen ich verstehe nicht alles was Du mir sagen möchtest,

Kann sein. Ich auch nicht :wink:

Also: Jede PE-Datei, sei es DLL, EXE oder was auch immer stellt ein Modul dar. Wenn nun ein Excel-Dokument im Internet Explorer geladen wird, wird (vermute ich mal) höchstwahrscheinlich eine DLL als Plugin geladen. Diese DLL kann man nun folgendermaßen finden (vorausgesetz, man kennt ihren Namen):

1. Mit CreateToolHelp32SnapShot einen Snapshot der Prozesse machen.
2. Jetzt kann man alle IE-Prozesse erkennen
3. Erneut mit CreateToolHelp32SnapShot einen Snapshot der Module jedes oben gefundenen Prozesses machen (Stichwort: Module32First bzw. Module32Next)
4. Jetzt kann man prüfen, welche Prozesse die entsprechende DLL geladen haben.

Achtung: Diese Methode ist recht rechenaufwändig und außerdem beruht sie auf der Annahme, bei der Darstelung von Excel-Doks im IE würde ein Modul geladen. Falls das nicht der Fall ist, kann man obiges ganz in die Mülltonne treten.
Außerdem ist man hier noch nicht fertig. Man muss noch aus der Prozess-ID das Handle des Hauptfensters finden, was über EnumThreads des Prozesses und EnumThreadWindows aller Threads des Prozesses geht.

Alles in allem ein sehr komplizierter Weg, wenn er denn überhaupt funktioniert. Wahrscheinlich gibt es einen einfacheren weg, vielleicht mit Benutzung der Excel-OLE-Objekte.

Edit:
Zitat:

Zitat von APP
nunja ich bekomme nun die PID's (?) des Programmes das ich zuvor mit vollem Pfad an GetThreadID übergeben habe.

Nicht ganz. Du bekommst alle Thread-IDs des Prozesses, den du mit vollem Pfad an die Funktion übergeben hast.
Allerdings fällt mir gerade auf, dass das nur sinnvoll ist, wenn nur eine Instanz des Programms läuft, da nur die Thread-IDs des erstgefundenen Prozesses aufgelistet werden.

APP 1. Apr 2003 11:59

Leute, ich gebs auf!
 
Hallo,

nachdem ich stundenlang eine Lösung zu meinem Problem
Zitat:

Daher möchte ich nur wissen, falls das Programm im IE eingebettet ist, dann den IE zeigen, sonst das Programmfenster zeigen.
suchte (und keine akzeptable gefunden habe) hat mir folgendes Ereignis den Rest gegeben:

Es passiert sehr häufig, dass, wenn man über den IE *.pdf oder *.xls Dokumente öffnet und sich die jeweilige Applikation in den Browser einbettet, Programm(fragmente) im Speicher zurückbleiben, wenn man den Browser längst wieder geschlossen hat!

Delphi-Quellcode:
FindWindow(pchar('XLMAIN'), NIL)
identifiziert diese auch als Instanz von Excel, daher ist es für mich unmöglich zu erkennen, ob der Prozess nun "nur im Speicher" steht, oder ob er in ein anderes Programm eingebettet ist!
Obwohl ich nun mit
Delphi-Quellcode:
ShowWindow(aHandle, SW_SHOWNORMAL);
diese Speicherleichen zeigen kann, damit sie der User schliessen kann. :roll:

Tja, danke für die Hilfe und aus! :pale:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz