CreateProcess Überwachen und Auswerten
-
Dieser Thread wurde von Moderator/in junix aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
http://www.c-plusplus.net/forum/viewtopic.php?t=39369
http://www.codeproject.com/threads/procmon.asp (funktioniert bei mir zur Zeit leider nicht
)
-
Danke erstmal für die Antwort!

aber irgentwie ist das nicht ganz das was ich suche ... mhh
also ich habe den Pfad des Prozesses (und die PID) und nun will ich ihn killen ... anhand des Fenstertitels habe ich einen Prozess ja schon beenden können. Doch wie gehts wenn man nur den Pfad zur *.exe hat ?

-
wenn du die ID hast kannst du das hier aus den FAQ nehemn: ShellExecute - Fenster wieder schliessen

-
okay doofe frage:
Wenn ich nur den Pfad habe wie kann ich dann die PID ermitteln ? (um logischerweise den Prozess zu killen)

-
Schau dir mal dieses Beispiel an - du gehst also einfach alle laufenden Prozesse durch und schaust dann in der PROCESSENTRY32-Struktur die Variable szExeFile an und vergleichst sie mit dem zu suchenden Pfad.

-
ähhh !?! 0+0=1

also mhh vergleichen also:
if (pe32.szExeFile == "c:\\windows\\calc.exe") Application->MessageBox("alles cool","",32+0); else Application->MessageBox("FALSCH!","",32+0);ja okay das ist ein vergleich doch wohin damit in den souce ???

okay habs direkt unter die Anfrage "pe32.szExeFile" gesetzt und auf nen ButtonClick hab ich die Funkion GetProcessList() aufrufen lassen
->Ergebnis:mein Rechenknecht sagt immer FALSCH! egal ob der Rechner offen ist oder nicht ... und ich muss mein Projekt dann immer brutal killen weil´s sich aufhängt (wegen der Fiesen "Falsch!" MessageBoxen)
da stellt sich doch die Frage: Was stimmt hier nicht ?

-
TheGeek schrieb:
da stellt sich doch die Frage: Was stimmt hier nicht ?

Du vergleichst deine Zeichenketten nicht richtig
- Mit der WinAPI mach mach das z.B. mit lstrcmp
-
Krass ich geh Krachen
es geht !naja zumindest wird erstmal der Process erkannt ... jedoch leider nicht der komplette pfad.
also hier nun der Souce Code:
... if (lstrcmp(pe32.szExeFile, "calc.exe") == 0) app = true; // wieso kann ich hier nicht den kompletten pfad vergleichen ? else app = false; ... // und in meinem Timer1 Steht folgendes GetProcessList(); if (app) Label1->Color = clGreen; else Label1->Color = clRed;
Und wie geht´s mit dem Pfad ?
Ja und die PID kann man da bistimmt auch ermitteln oder ?
-
Ich habe mir mal den Code von dem ersten von mir verlinkten Beispiel angeschaut, und dort wird es so gemacht:
TCHAR szFileName[MAX_PATH]; GetProcessName( dwProcessId), szFileName, MAX_PATH );Diese Funktion gibt es aber noch nicht fertig, sondern hat der Autor selbst geschrieben:
// // Return the name of the process by its ID using PSAPI // BOOL CCallbackHandler::GetProcessName( DWORD dwProcessId, LPTSTR lpFileName, DWORD dwLen ) { BOOL bResult = FALSE; if (!::IsBadStringPtr(lpFileName, dwLen)) { ::ZeroMemory( reinterpret_cast<PBYTE>(lpFileName), dwLen * sizeof(TCHAR) ); if ((NULL != m_pfnEnumProcessModules) && (NULL != m_pfnGetModuleFileNameEx)) { // Let's open the process HANDLE hProcess = ::OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId ); if (NULL != hProcess) { HMODULE hModuleArray[1024]; DWORD cbNeeded; DWORD nModules; // EnumProcessModules function retrieves a handle for // each module in the specified process. if (m_pfnEnumProcessModules( hProcess, hModuleArray, sizeof(hModuleArray), &cbNeeded)) { // Calculate number of modules in the process nModules = cbNeeded / sizeof(hModuleArray[0]); if (nModules > 0) { // First module is the EXE. HMODULE hModule = hModuleArray[0]; DWORD dwCharRead = m_pfnGetModuleFileNameEx( hProcess, hModule, lpFileName, dwLen ); } // if } // if ::CloseHandle(hProcess); } // if } // if } // if return bResult; }Der Code ist eben Bestandteil seiner Klassenhirarchie - du wirst also wohl noch ein paar Änderungen vornehmen müssen
