AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ALLE Instanzen eines Programms (auch eingebettete Objekte)
Thema durchsuchen
Ansicht
Themen-Optionen

ALLE Instanzen eines Programms (auch eingebettete Objekte)

Ein Thema von APP · begonnen am 31. Mär 2003 · letzter Beitrag vom 1. Apr 2003
Antwort Antwort
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#1

ALLE Instanzen eines Programms (auch eingebettete Objekte)

  Alt 31. Mär 2003, 10:46
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,...)
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2
  Alt 31. Mär 2003, 11:55
Du musst einfach herausfinden, ob der Prozess EXCEL.EXE läuft. Wie das geht, findest du in der Suche.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#3
  Alt 31. Mär 2003, 13: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.
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 31. Mär 2003, 13: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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#5
  Alt 31. Mär 2003, 16: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.
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 31. Mär 2003, 20:56
Zitat von APP:
@Chewie,

ich muß gestehen ich verstehe nicht alles was Du mir sagen möchtest,
Kann sein. Ich auch nicht

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 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#7

Leute, ich gebs auf!

  Alt 1. Apr 2003, 12:59
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!

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 ShowWindow(aHandle, SW_SHOWNORMAL); diese Speicherleichen zeigen kann, damit sie der User schliessen kann.

Tja, danke für die Hilfe und aus!
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 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