![]() |
GetWindowModuleFileName gibt nichts zurück
Ich versuche per GetWindowModuleFileName den Namen (& Pfad) eines Programms über das FensterHandle herauszufinden, doch leider gibt die Funktion nichts zurück.
Mein Code sieht in etwa so aus:
Delphi-Quellcode:
Die "fname"-Message bleib immer leer. Weis jemand woran das liegt?
var
hWnd_ : HWND; fname : PAnsiChar; begin fname := nil; hWnd_ := FindWindow('Notepad', nil); if(hWnd_ = 0)then begin Application.MessageBox('FindWindow failed!', '', 0); exit; end; GetWindowModuleFileNameA(hWnd_, fname, MAX_PATH); Application.MessageBox(fname, 'fname', 0); end; ciao & thx, Philipp |
Re: GetWindowModuleFileName gibt nichts zurück
So msollte es gehen:
Delphi-Quellcode:
var
hWnd_ : HWND; fname : PAnsiChar; begin GetMem(fname, MAX_PATH); hWnd_ := FindWindow('Notepad', nil); if(hWnd_ = 0)then begin Application.MessageBox('FindWindow failed!', '', 0); exit; end; GetWindowModuleFileNameA(hWnd_, fname, MAX_PATH); Application.MessageBox(fname, 'fname', 0); end; |
Re: GetWindowModuleFileName gibt nichts zurück
@Dax: Das hab ich auch schon probiert, leider erfolglos.
|
Re: GetWindowModuleFileName gibt nichts zurück
Versuche fName als Array[0..MAX_PATH] of Char zu deklarieren.
|
Re: GetWindowModuleFileName gibt nichts zurück
@jim_raynor: Hab ich auch schon probiert, funktioniert leider auch nicht. :(
|
Re: GetWindowModuleFileName gibt nichts zurück
Dann prüfe doch mal mit GetLastError den Fehlercode, den dir Windows zurück gibt.
|
Re: GetWindowModuleFileName gibt nichts zurück
Zitat:
Kann das mal jemand bei sich testen? Geht das allgemein nicht, liegt es an meinem rechner, oder is da irgendwas anderes faul? |
Re: GetWindowModuleFileName gibt nichts zurück
Der Klssen name vom Notepad ist wahrscheinlich nicht "Notepad":
Delphi-Quellcode:
Als Handle wirst du dann eben null zurückbekommen. Guck doch erstmal, ob diu da ein gültiges Handle bekommst. Desweiteren würde ich den Vorschlag mit GetLastError nicht so einfach abtun, wer weiß, was eventuell noch shcief geht. :roll:
hWnd_ := FindWindow('Notepad', nil);
|
Re: GetWindowModuleFileName gibt nichts zurück
Zitat:
Zitat:
Kann jemand den code bei sich testen, ob er da funktioniert, bitte! ciao, Philipp |
Re: GetWindowModuleFileName gibt nichts zurück
Zitat:
|
Re: GetWindowModuleFileName gibt nichts zurück
GetModuleFilename funktioniert glaub ich nur wenn das handle zu deiner anwendung gehört, also du zum beispiel eine dll eingebunden hast. Wenn du an den dateinamen der Anwendung willst zu dem das Handle gehört musst du das anders machen.
[Edit]Hab grad mal die Suche bemüht und einen Beitrag gefunden den ich mal gepostet hab der genau das macht was du willst Hier der Link: ![]() [/Edit] |
Re: GetWindowModuleFileName gibt nichts zurück
Also, ich hab nun mal GetLastError zu meinen Überwachten "ausdrücken" hinzugefügt (funktionsaufrufe sind gestattet), und bin schritt für schritt durchgegangen, und GetLastError war *immer* 0
Da ist kein "fehler" da ... oder? :gruebel: :wiejetzt: :roll: @SirThornberry: Sollte dann da nicht zumindest ein Hinweis in der PSDK dazu stehen? Ich hab keinen gesehen ... |
Re: GetWindowModuleFileName gibt nichts zurück
Guck dir mal den ersten Parameter an:
Zitat:
Du müsstest also ![]() Enumerating All Modules For a Process To determine which processes have loaded a particular DLL, you must enumerate the modules for each process. The following sample code uses the ![]()
Code:
#include <windows.h>
#include <stdio.h> #include "psapi.h" void PrintModules( DWORD processID ) { HMODULE hMods[1024]; HANDLE hProcess; DWORD cbNeeded; unsigned int i; // Print the process identifier. printf( "\nProcess ID: %u\n", processID ); // Get a list of all the modules in this process. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); if (NULL == hProcess) return; if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) { for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ) { char szModName[MAX_PATH]; // Get the full path to the module's file. if ( GetModuleFileNameEx( hProcess, hMods[i], szModName, sizeof(szModName))) { // Print the module name and handle value. printf("\t%s (0x%08X)\n", szModName, hMods[i] ); } } } CloseHandle( hProcess ); } void main( ) { // Get the list of process identifiers. DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name of the modules for each process. for ( i = 0; i < cProcesses; i++ ) PrintModules( aProcesses[i] ); } |
Re: GetWindowModuleFileName gibt nichts zurück
wenn du mal anstelle des notepadhandles das handle der eigenen Anwendung nimmst wirst du sehen das dein Beispiel funktioniert. Daraus hab ich das einfach mal vermutet das es daran liegt das es kein Handle ist das zur eigenen Anwendung gehört. Wenn du eine DLL in dein programm einbindest und in der dll dein source mit dem handle der hostanwendung ausführst sollte das auch funktionieren... naja, wie schon geschrieben hab ich den link zu funktionierendem source schon gepostet.
|
Re: GetWindowModuleFileName gibt nichts zurück
Zitat:
|
Re: GetWindowModuleFileName gibt nichts zurück
Zitat:
ok, da wohl niemand ne idee hat woran das liegen könnte ... muss ich wohl doch wieder zur längeren Methode greifen ... :-| ... trotzdem danke für eure Ratschläge, Tipps & Bemühungen! ciao, Philipp [edit]man seid ihr schnell ... ich wollte es schon aufgeben (hab die letzen posts nimmer gesehen) ... ^^ ... ok, danke[/edit] |
Re: GetWindowModuleFileName gibt nichts zurück
Hab mal schnell den Code rausgesucht den ich in meinem X-Spy verwend und bissi angepasst...
Delphi-Quellcode:
@w3seek: jain.. es ist ein Module-Handle.. das PSDK sagt dazu:
function GetWindowModule(Window: HWND): String;
var dwProcessID : DWord; Process : hProcess; Module : hModule; Path : array [0..MAX_PATH] of Char; begin GetWindowThreadProcessID(Window, @dwProcessID); Module := GetClassLong(Window, GCL_HMODULE); if (Module = 0) and (GetLastError <> 0) then Result := '(Unavailable)'; else begin Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, dwProcessID); if Process <> 0 then begin if GetModuleFileNameEx(Process, Module, Path, MAX_PATH) > 0 then begin GetLongPathName(Path, Path, MAX_PATH); Result := String(Path) end else Result := '(Unavailable)'; CloseHandle(Process); end else Result := '(Unavailable)'; end; end; Zitat:
|
Re: GetWindowModuleFileName gibt nichts zurück
es ist definitv kein handle :P weder ein user/gdi object, noch ein kernel handle. es ist einfach ein pointer zur base adresse des moduls. nichts mehr und nichts weniger ;)
|
Re: GetWindowModuleFileName gibt nichts zurück
bei mir geht das so:
Code:
var
lProcessID: dWord; lHandle: THandle; begin GetWindowThreadProcessId(WindowHandle, @lProcessID); SetLength(Buffer, MAX_PATH); lHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, lProcessID); if GetModuleFileNameEx(lHandle, 0, PChar(Buffer), MAX_PATH) > 0 then SetLength(Buffer, StrLen(PChar(Buffer))); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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