Dateiname eines Handle
-
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!