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 Problem mit GetModuleFileName (https://www.delphipraxis.net/111433-problem-mit-getmodulefilename.html)

gpvg 3. Apr 2008 13:27


Problem mit GetModuleFileName
 
Die Beschreibung in Turbo Delphi:
Rufen Sie GetModuleFileName auf, um den vollständig qualifizierten Namen eines Moduls anhand seines Handles abzurufen. Die in der Unit System definierte Version von GetModuleFileName steht nur unter Linux zur Verfügung. Unter Windows verwenden Sie stattdesseen die Windows-API mit demselben Namen.
Module ist das Handle des Moduls, dessen Name erforderlich ist.
Buffer ist ein Puffer, der den Dateinamen empfängt.
BufLen ist die Anzahl der Byte in Buffer.
GetModuleFileName gibt die Anzahl der Byte zurück, die in Buffer geschrieben werden.

Soweit alles in Ordnung.

Jetzt kommt aber der Hammer!
Warnung:
GetModuleFileName liefert nicht immer den gewünschten Rückgabewert. Unter bestimmten Bedingungen (Aufrufart der Anwendung, Vorhandensein des /proc-Dateisystem usw.) kann GetModuleFileName einen Namen zurückgeben, der nicht voll qualifiziert ist. Manchmal wird auch überhaupt kein Dateiname zurückgegeben. Vergessen Sie nicht, die Ergebnisse dieser Funktion zur überprüfen, bevor Sie den Rückgabewert verwenden.

Tja, genau vor diesem Problem stehe ich. Ich habe das Handle eines Prozesses, aber GetModuleFileName spuckt nichts aus. Ich brauche aber den vollen Pfadnahmen des Prozesses.
Weiß jemand, wie man noch an den vollen Pfadnamen herankommt?

Luckie 3. Apr 2008 13:45

Re: Problem mit GetModuleFileName
 
Zeig mal deinen Code, eventuell ist dort ein Fehler drin.

Andi1985 3. Apr 2008 13:56

Re: Problem mit GetModuleFileName
 
If the function fails, the return value is 0 (zero).
To get extended error information, call GetLastError.

sagt GetLastError() vieleicht was?

OldGrumpy 3. Apr 2008 16:18

Re: Problem mit GetModuleFileName
 
Moment, GetModuleFileName funktioniert doch nur für den eigenen Prozess. Um prozessübergreifend zu arbeiten gibt es GetModuleFileNameEx - nichtsdestotrotz wirfst Du zusätzlich die unterschiedlichen Arten Handles durcheinander.

Ein paar Pointer wie Du den Prozessnamen (inkl. Pfad) bekommst:

- EnumProcessModules liefert eine Liste aller Module im spezifizierten Prozess
- Der erste Eintrag in der Liste ist immer die Exe
- GetModuleFileNameEx mit Prozess-Handle und Module-Handle aus obiger Liste liefert dann den Namen.

War jetzt zu faul, da auch noch die MSDN-Seiten zu verlinken, Google hilft :)

gpvg 3. Apr 2008 17:30

Re: Problem mit GetModuleFileName
 
Zitat:

Zitat von Luckie
Zeig mal deinen Code, eventuell ist dort ein Fehler drin.

Im wesentlichen Folgendes. Das Handle hole ich mir aus der Prozeßtabelle.

var
ModulePath: array[0..MAX_PATH] of Char;
hModule: cardinal;

begin
GetModuleFileName(hModule, ModulePath, length(ModulePath));
Writeln(Modulepath);
end.


Habe mir mal Dein EnumProcesses gesaugt. Vielleicht steht dort die Lösung.

gpvg 3. Apr 2008 17:34

Re: Problem mit GetModuleFileName
 
Zitat:

Zitat von OldGrumpy
Moment, GetModuleFileName funktioniert doch nur für den eigenen Prozess.

Davon steht aber nichts in der Delphi-Hilfe. Muß ich wohl noch ein wenig suchen.

Luckie 3. Apr 2008 17:37

Re: Problem mit GetModuleFileName
 
Zitat:

Zitat von gpvg
Davon steht aber nichts in der Delphi-Hilfe. Muß ich wohl noch ein wenig suchen.

Dafür aber in der zugehörigen Hilfe:
Zitat:

Retrieves the fully-qualified path for the file that contains the specified module. The module must have been loaded by the current process.
Wenn es um Windows API-Funktionen geht, würde ich immer die Dokumentation von Microsoft heranziehen und mich nicht auf Aussagen Dritter verlassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:55 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