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 EXE-/Modulname aus Fensterhandle ermitteln (https://www.delphipraxis.net/47275-exe-modulname-aus-fensterhandle-ermitteln.html)

Marphy 8. Jun 2005 17:50


EXE-/Modulname aus Fensterhandle ermitteln
 
Hallo zusammen,
meine Frage (diesmal ganz kurz :wink:):
Wie kann ich aus einem beliebigen, existierenden Fensterhandle [ IsWindow(MyHandle) = True ] dessen vollständigen EXE-/Modul-Dateinamen ermitteln?

Dass dies mit GetModuleFileName zu lösen ist, ist mit klar. Ich weiß nur nicht, wie man aus der hWnd das Instanzen-/Modul-Handle hInstance (bzw. hModule, ist das gleiche?) ermitteln kann.

Ich hoffe, ihr könnt mir da (mal wieder :mrgreen:) helfen...

Gruß, Marco

c113plpbr 8. Jun 2005 17:56

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Warum nimmst du nicht einfach GetWindowModuleFileName?

ciao, Philipp

DGL-luke 8. Jun 2005 18:06

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
weil er gerade gesagt hat, dass er nicht versteht, wie er es nutzen soll?

Olli 8. Jun 2005 18:15

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von DGL-luke
weil er gerade gesagt hat, dass er nicht versteht, wie er es nutzen soll?

Lies lieber nochmal. Es wurde eine komplett andere API vorgeschlagen ;)

Will sagen: Die Aussage von c113plpbr ist vollkommen zutreffend.

c113plpbr 8. Jun 2005 18:16

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von DGL-luke
weil er gerade gesagt hat, dass er nicht versteht, wie er es nutzen soll?

er weis nur nicht wie man GetModuleFileName benutzt, aber mit GetWindowModuleFileName könnte er es relativ einfach verstehen ... da seine frage sich ja eigentlich darauf bezog, wie man von einem fensterhandle über ein modulhandle zum Dateinamen kommt. Mit der von mir vorgeschlagenen Funktion fällt dieser Umweg weg.

[edit2]so, jetzt aber[/edit2]

ciao, Philipp

Marphy 8. Jun 2005 18:19

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Habe ich auch schon versucht, funktioniert aber irgendwie nicht (SetForeground mit der selben hWnd aber schon, außerdem erst ab NT SP3)... :?

Gruß, Marco

DGL-luke 8. Jun 2005 18:20

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
oha, ja, sorry. da hab ich mich verlesen...

Olli 8. Jun 2005 18:23

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Marphy
Habe ich auch schon versucht, funktioniert aber irgendwie nicht (SetForeground mit der selben hWnd aber schon, außerdem erst ab NT SP3)... :?

GWL_HINSTANCE und GetWindowLong() sind deine Freunde. Hilft allerdings nicht viel, weil das Instanzenhandle in deinem Prozess vermutlich genau deine EXE identifiziert.

c113plpbr 8. Jun 2005 19:52

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Olli
GWL_HINSTANCE und GetWindowLong() sind deine Freunde. Hilft allerdings nicht viel, weil das Instanzenhandle in deinem Prozess vermutlich genau deine EXE identifiziert.

Dazu gibts ja eigentlich GetModuleFilenameEx, allerdings akzeptiert das dieses Handle nicht ... warum auch immer ... daher empfehle ich die untenstehende lösung ...
Zitat:

Zitat von Marphy
Habe ich auch schon versucht, funktioniert aber irgendwie nicht

Seltsam ... na dann probier mal das:
Delphi-Quellcode:
uses PsApi;

(*...*)

var
  hwnd_ : HWND;
  PID : Cardinal;
  hProc : Cardinal;
  Buffer : array[0..MAX_PATH - 1] of Char;
  modules : array of HModule;
  modulecount : cardinal;
begin
  hwnd_ := FindWindow('Notepad', nil);

  GetWindowThreadProcessId(hwnd_, PID);
  hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);

  EnumProcessModules(hProc, nil, 0, modulecount);
  SetLength(modules, modulecount div SizeOf(HModule));
  EnumProcessModules(hProc, PDWord(@modules[0]), modulecount, modulecount);

  GetModuleFilenameEx(hProc, modules[0], @Buffer[0], MAX_PATH);

  ShowMessage(string(Buffer));

  CloseHandle(hProc);
end;
Is natürlich auch wieder NT-only ... aber wenn das auch ned funktioniert, dann schau mal, ob es nicht von irgendwas geblockt wird ... z.B. ZoneAlarm tut das manchmal ganz gern ... ^^

Und unter 9x-Systemen solltest du über GetWindowThreadProcessId die PID rausfinden können, und über CreateToolhelp32Snapshot, Process32First & Process32Next sämtliche Prozesse auflisten können. Du müsstest dann nurnoch die PID's vergleichen, und wenn du dann die richtige gefunden hast, einfach in szExeFile den Namen nachschauen ...

ciao, Philipp

Marphy 10. Jun 2005 21:11

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Hallo zusammen,
danke für eure Bemühungen!

Mit GetModuleFileName() funktioniert es nach wie vor nicht, sehr wohl aber mit GetModuleFileNameEx und einem vorgeschobenen OpenProcess. :dancer:
OpenProcess muss mit Zugriff PROCESS_QUERY_INFORMATION or PROCESS_VM_READ aufgerufen werden - hatte Letzteren bisher weggelassen, aber ohne ihn hat dat Janze dann eben nich funktioniert :x) :wink:

Gruß, Marco

c113plpbr 10. Jun 2005 21:17

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Marphy
Mit GetModuleFileName() funktioniert es nach wie vor nicht, sehr wohl aber mit GetModuleFileNameEx und einem vorgeschobenen OpenProcess. :dancer:

Du hättest nur meinen Code kopieren müssen ... das steht das nämlich drin ... ^^

ciao, Philipp

Marphy 10. Jun 2005 21:21

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Hi,
ja, aber das "NT-only" EnumModules kann man sich sparen... In GetModuleFileName in hModule einfach 0 übergeben. Somit ist der Code von Win95 bis hin zu WinXP kompatibel, man muss auch nicht zwischen zwei Codes (ProcessSnapshot und EnumProcesses/EnumModules) betriebssystembedingt switchen. :???:

Gruß, Marco

c113plpbr 10. Jun 2005 21:32

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Marphy
ja, aber das "NT-only" EnumModules kann man sich sparen... In GetModuleFileName in hModule einfach 0 übergeben. Somit ist der Code von Win95 bis hin zu WinXP kompatibel, man muss auch nicht zwischen zwei Codes (ProcessSnapshot und EnumProcesses/EnumModules) betriebssystembedingt switchen. :???:

Hmm ... stimmt ... ^^ ... ich hätte halt den code nochmal "überdenken" müssen ... aber darauf muss man erstmal kommen ...

ciao, Philipp

Marphy 14. Jun 2005 20:31

Problem doch noch nicht ganz gelöst...
 
Hallo zusammen,

Zitat:

Zitat von Marphy
Somit ist der Code von Win95 bis hin zu WinXP kompatibel, man muss auch nicht zwischen zwei Codes (ProcessSnapshot und EnumProcesses/EnumModules) betriebssystembedingt switchen.

Mist! :wall:
Habe im PSDK übersehen, dass GetModuleFileNameEx nur für NT-basierte Betriebssysteme verfügbar ist :x Also muss ich doch zwischen der ProcessSnapshot- (für Win9x) und der GetModuleFileNameEx-Variante betriebssystemabhängig umschalten.

Das eigentliche Problem:
Die PROCESSENTRY32 Struktur stellt zwar einen Member für den EXE-Dateinamen bereit, welcher aber wirklich nur den Dateinamen enthält, ich benötige aber den vollständigen Dateipfad! :cry:

Wie kann ich nun den vollständigen Moduldateinamen (inkl. -pfad) auch unter Win9x ermitteln?

Danke schon im Voraus für eure weitere Hilfe,
Marco

c113plpbr 15. Jun 2005 15:18

Re: Problem doch noch nicht ganz gelöst...
 
Zitat:

Zitat von Marphy
Das eigentliche Problem:
Die PROCESSENTRY32 Struktur stellt zwar einen Member für den EXE-Dateinamen bereit, welcher aber wirklich nur den Dateinamen enthält, ich benötige aber den vollständigen Dateipfad! :cry:

Bist du dir da ganz sicher? Nein, MSDN konsultieren: MSDN-Library durchsuchenPROCESSENTRY32
MSDN: PROCESSENTRY32
szExeFile
Pointer to a null-terminated string that specifies the name of the executable file for the process.

Windows Me/98/95: The file name includes the path.


LÖL! Hab gerade bemerkt, dass dieser letzte satz zwar in meiner (offline) MSDN steht, aber nicht in der Online-MSDN ... :gruebel: :mrgreen:

Tipp: besorg dir ne offline-version ... ;)

ciao, Philipp

Marphy 15. Jun 2005 16:32

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Hallo Philipp,
bist wohl der einzige, der hier Nachmittags online ist?! :-D

Zitat:

Bist du dir da ganz sicher? Nein, MSDN konsultieren: PROCESSENTRY32
Zum Ersten habe ich das unter W2k ausgetestet (da kann mir also selbst der PSDK nichts weiß machen) und zum Zweiten: Wo steht in deiner Quelle denn bitte etwas vom vollständigen Dateipad?!
Zitat:

szExeFile
Pointer to a null-terminated string that specifies the name of the executable file for the process.
Zitat:

LÖL! Hab gerade bemerkt, dass dieser letzte satz zwar in meiner (offline) MSDN steht, aber nicht in der Online-MSDN ...
Ahhhh! :-D Super!

Zitat:

Tipp: besorg dir ne offline-version ...
Ich habe mir den PSDK schon vor einigen Wochen heruntergeladen. 100 MB per DSL in 10 Minuten, kein Problem :???:

Grüße und Danke, Marco

Olli 16. Jun 2005 20:03

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Marphy
Ich habe mir den PSDK schon vor einigen Wochen heruntergeladen. 100 MB per DSL in 10 Minuten, kein Problem :???:

100 MB gesamt? Dann hast du vermutlich nicht alles. Nur so als Hinweis!

Marphy 16. Jun 2005 20:13

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Hallo Herr Schneider, :mrgreen:
Zitat:

Zitat von Olli
Zitat:

Zitat von Marphy
Ich habe mir den PSDK schon vor einigen Wochen heruntergeladen. 100 MB per DSL in 10 Minuten, kein Problem :???:

100 MB gesamt? Dann hast du vermutlich nicht alles. Nur so als Hinweis!

Vielleicht waren's auch 200 MB, aber es war der gesamte PSDK. :stupid:

Gruß, Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.

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