Dateiname eines Handle
-
Ja mach mich ruhig fertig *g*.
Ich weiß aber net, ob GetModuleFileName() der richtige Befehl is oder ob es vielleicht noch einfacher geht.
Vielleicht sowas: HandleToFilename, aber den gibts ja leider net.
-
Ich wollte dich nicht "fertigmachen".
Du musst bedenken, dass nicht jedes Handle eine Datei repräsentiert. Es gibt auch Bildschirmhandles oder Fensterhandles. Deswegen ergäbe eine Funktion HandleToFilename wenig Sinn.
Klappt GetModuleFileName nicht?
-
Ich wollte dich nicht "fertigmachen".
War auch mehr als Witz gemeint: Deshalb das *g*.
Ehrlich gesagt weiß ich net wo ich die ganzen Parameter hernehmen soll.
DWORD GetModuleFileName(
HMODULE hModule, <--//Soll das das Handle sein?
LPTSTR lpFilename, <--//Wie konvertiere ich den zu einem AnsiString?
DWORD nSize <--//Kapier ich net: Was soll das?
);Ich glaub man merkt, dass ich mich mit den C-Strings net so auskenne, aber irgendwann hab hoffentlich auch ichs kapiert
-
TCHAR szName[MAX_PATH]; GetModuleFileName(hModule,szName,sizeof(szName)/sizeof(szName[0])); // sizeof(szName)/sizeof(szName[0]) entspricht hier MAX_PATH
hModule
Handle to the module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path of the executable file of the current process.
-
Danke:
Es gibt keine Fehler!
-
Allerdings wird kein Wert zurückgegeben:
TCHAR szName[MAX_PATH]; GetModuleFileName(MeinHandle,szName,sizeof(szName)/sizeof(szName[0])); AnsiString zsName; zsName = AnsiString(szName[sizeof(szName)/sizeof(szName[0])]); StatusBar1->SimplePanel=true; ShowMessage(zsName);
-
AnsiString(szName[sizeof(szName)/sizeof(szName[0])]);
Was soll das geben
Ich kenne mich zwar mit VCL nicht aus, aber es sollte doch wohl eher so irgendwie aussehen:
AnsiString(szName);
-
Warum erst die Variable erstellen und danach zuweisen? So ist es viel effizienter:
AnsiString zsName = szName;
-
Das hab ich in zwischen auch, nur dass ich scheinbar ein falsches Handle liefere.
Ich liefere ein über EnumWindows geliefertes Handle. Wenn ich das Handle in GetModuleFileName weglasse, kriege ich den Dateiname und Pfad meines Programmes (so muss es ja auch sein), also kann es nicht an der String umwandelung liegen.
Woher kriege ich ein korrektes Handle?
-
Zeig mal, wie du "MeinHandle" bekommst.
-
Ja bidde:
HWND MeinHandle; BOOL CALLBACK MeinHandlekriegen(HWND hwnd,LPARAM lParam) { // Falls kein Child-Fenster: if(!GetWindow(hwnd, GW_OWNER)) { MeinHandle = hwnd; //Ich weiß, dass in diesem Fall nur das letzte Handle //zurückgegeben wird, aber die Methode die ich anwende, wäre zu lang. //Zaehlwerk+1 //ich mach das ungefähr so: MeinHandle[Zaehlwerk] = hwnd; //------------------------------------- } // true zurückgeben, um Aufzählung fortzusetzten: return TRUE; } EnumWindows((WNDENUMPROC)ShowAllWindows, 0);
Ich hab den Code nochmal geändert: Jetzt nehm ich das Prozess-Handle:
BOOL CALLBACK ShowAllWindows(HWND hwnd,LPARAM lParam) { DWORD pid = 0; // Für die Process-Id HWND hProcess; char pcWinTitle[256]; // Für Fenster-Titel... // Falls kein Child-Fenster: if(!GetWindow(hwnd, GW_OWNER)) { // Fenster-Title (Caption) auslesen: GetWindowText(hwnd, pcWinTitle, 255); // Falls Titel vorhanden in die Listbox einfügen: if(AnsiString(pcWinTitle).Trim() != EmptyStr) { TListItem *ItemWinTitle = Form1 ->ListView1->Items->Add(); ItemWinTitle->Caption=pcWinTitle; ItemWinTitle->SubItems->Add(IntToStr(int(hwnd))); CurrentHandle[Form1->ListView1->Items->Count-1] = hwnd; // Process-Id besorgen: GetWindowThreadProcessId(hwnd, &pid); // Process mit allen Zugriffsrechten öffnen: hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid); Zaehlwerk = Zaehlwerk+1; CurrenthProcess[Zaehlwerk] = hProcess; } } // true zurückgeben, um Aufzählung fortzusetzten: return TRUE; }
-
Ich hab jetzt mal was gebastelt - weiß aber net, ob das immer richtig funktioniert
DWORD pid; GetWindowThreadProcessId(hwnd, &pid); HANDLE hProcess = (HANDLE)OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid); HMODULE hModule; EnumProcessModules(hProcess,&hModule,sizeof(HMODULE),NULL); TCHAR szName[MAX_PATH]; GetModuleFileNameEx(hProcess,hModule,szName,sizeof(szName)/sizeof(szName[0])); MessageBox(NULL,szName,"",0);
-
Borand C++ Builder sagt:
[C++ Error] AllAppShower.cpp(221): E2268 Call to undefined function 'EnumProcessModules' [C++ Error] AllAppShower.cpp(224): E2268 Call to undefined function 'GetModuleFileNameEx'
Wenn ich die Psapi.h einbinde sagt der Builder folgendes:
[Linker Error] Unresolved external 'EnumProcessModules' referenced from C:\PROGRAMME\BORLAND\CBUILDER6 EN\PROJECTS\ALLAPPVIEWER.OBJ [Linker Error] Unresolved external 'GetModuleFileNameExA' referenced from C:\PROGRAMME\BORLAND\CBUILDER6 EN\PROJECTS\ALLAPPVIEWER.OBJ
Muss ich mir da irgendwas runterladen und wenn, müssen das dann die Leute die das Programm nutzen wollen auch tun?
Aber erstmal "Danke!" für alle Antworten bis hierhin!
-
Du mußt die psapi.lib noch verlinken!
Sowas steht eigentlich bei jeder Funktion in der MSDN ganz unten dabei!
[msdn]GetModuleFileNameEx[/msdn]
oder
MSDN schrieb:
Requirements
Client: Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
Server: Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.
Unicode: Implemented as Unicode and ANSI versions.
Header: Declared in Psapi.h; include Psapi.h.
Library: Use Psapi.lib.
-
Alles klappt!!!
Danke, danke: 1000x Danke!