CreateProcess Überwachen und Auswerten



  • Hallo Leutz !

    Also ich habe folgendes Problem:

    Im Windows ist die Application abc.exe geladen und nun will ich die App 123.exe starten. Wenn die App 123.exe Startet soll abc.exe gekillt werden und 123.exe überwacht werden denn wenn 123.exe beendet wird soll abc.exe wieder gestartet werden.

    So ich hoff mal ihr könnt das nachvollziehen ... 🙂

    Mir ist bekannt das ich irgentwie CreateProcess verwenden kann -> Aber wie ?

    ...ich hätt ja auch gerne im Forum gesucht aba die Suchfunkion is off 😡

    Thanks
    TheGeek





  • Okay habe die informationen mal durchgearbeitet ... Funzt auch alles ganz fein 🙂

    Aber leder habe ich keine infos über das schließen einer application gefunden
    😞

    Weiß jemand wie ich einen CreateProcess wieder "killen" kann ?



  • Ich habe es so gemacht.

    TerminateProcess( sProcessInfo.hProcess , 0 );



  • Kann ich damit auch einen Process "killen" den ich nicht ausgelöst habe ...

    also zB SystemProzesse (Spooler ... etc) ?

    Weil ich hab das net so ganz hinbekommen ...



  • Oder auch anders gefragt:

    Wie kann ich die Process_information von bereits getarteten Prozessen ermitteln ?

    😕



  • Was verleitet dich zu der Annahme, dass dieses Problem etwas mit der VCL zu tun hat?

    -> Verschoben nach WinAPI.



  • 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.





  • 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 🙄


Anmelden zum Antworten