Prozess durch Dateinamen finden
-
hallo,
ich möchte gerne ein handle von einem prozess haben,
aber ich weiß net wie!
Ich weiß wie der Prozess heißt (*.exe) aber wie bekomme ich das handle?
habe alles in google abgeklappert, aber ich finde nischts.hilfee
-
AeroX schrieb:
habe alles in google abgeklappert, aber ich finde nischts.
Da solltest du aber mal üben ...
Bei M$ gibt es das in der MSDN Hilfe komplett mit Quelltext!!
// MSDN Hilfe V8.0: "Enumerating All Processes"
The EnumProcesses function retrieves the process identifier for each process object in the system.
HMODULE hMod; DWORD cbNeeded; BOOL EnumProcesses(DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned); HANDLE hProcess = OpenProcess ( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded); GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName)/sizeof(TCHAR) );
alternativ auch
// MSDN Hilfe V8.0: "Taking a Snapshot and Viewing Processes"
This simple console application obtains a list of running processes.
First, the GetProcessList function takes a snapshot of currently executing
processes in the system ...Natuerlich braucht man ein Plattform-SDK, aber das ist beim VS dabei und
laesst sich auch ansonsten online nutzen oder kostenlos bei MS downloaden.
-
Also, danke für die schnelle antwort,
aber es geht nicht.Dein code funktioniert nicht weil processID, szProcessName... nicht deklariert ist.
und bei msdn: "Enumerating All Processes"
kommt nur:Fehler 1 error LNK2001: Nicht aufgelöstes externes Symbol "_EnumProcessModules@16". ReadMemory.obj
hilfe!
-
schau Dir das Beispiel an, da is alles Beschrieben.
http://msdn.microsoft.com/en-us/library/ms682623(VS.85).aspx
Gruß Matthias
-
@Matthias: genau das meinte ich
Vielleicht sollte man dann auch gleich das ganze Kapitel PSAPI lesen.
http://msdn.microsoft.com/en-us/library/ms684884(VS.85).aspxWenn der Linker das o.a. Symbol nicht auflösen kann ist in den Projekteigenschaften vermutlich unter Linker/Zusätzliche Abhängigkeiten die psapi.lib nicht richtig eingebunden.
Möglicherweise fehlt auch der Pfad zum Platform-SDK unter Extras/Optionen/Projekte../VC++ Verzeichnisse.
-
nach nedlich, ich habs jetzt.
habe die "Psapi.lib" gesucht und den link dann so verwendet...
#pragma comment(lib, "C:\\Programme\\Microsoft SDKs\\Windows\\v6.0A\\Lib\\Psapi.Lib")
-
Ups, habe vergessen den Quellcode vergessen^^
für alle die damit noch probleme haben werden...
HANDLE GetHandle(const wchar_t *pName) { DWORD aProcesses[1024], cbNeeded, cProcesses; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) { cout << "EnumProcesses threw an error!" << '\n'; system("pause"); exit(1); } cProcesses = cbNeeded / sizeof(DWORD); for (unsigned int i = 0; i < cProcesses; i++ ) { if( aProcesses[i] != 0 ) { TCHAR szProcessName[32]; HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]); if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); if (_wcsicmp(pName, szProcessName)) { return hProcess; } } } CloseHandle( hProcess ); } } return 0; }
Beispiel: HANLDE pHandle = GetHandle(L"WINmine.exe");
-
Schon sehr schön.
Wollte noch anmerken, wenn man den Pfad noch wissen muss kann man GetProcessImageFileName verwenden.
DWORD WINAPI GetProcessImageFileName( __in HANDLE hProcess, __out LPTSTR lpImageFileName, __in DWORD nSize);
Retrieves the name of the executable file for the specified process.
lpImageFileName: A pointer to a buffer that receives the full path to the executable file.
--
Ich würde auch GetHandle(_T("WINmine.exe")) verwenden.
VG
merano