Prozess idendifizieren und abschalten



  • Hallo Liebe Leute

    Nun ich machs einfach.
    Ich will ein Programm schreiben das mir erlaubt Prozesse zu idendifizeren ihnen einen zeit geben wo sie Laufen Können und danach abzuschalten.

    Nun ich weis nur nicht wie ich herausfinden kann ob der prozess läuft.
    die sache mit der zeit ist kein Problehm das weis ich wie und das abschalten auch.

    Ich kann c (einigermassen) sonst keine andere programmiersprache.

    Währe nett enn ihr mir helfen Köntet.

    Grüsse Oliver



  • Ich will ein Programm schreiben das mir erlaubt Prozesse zu idendifizeren

    c hat keine prozesse oder täusch ich mich?

    am besten sagst uns mal welches os...

    lg lolo



  • einen anderen Prosess windows xp und vista taublich sollte das ganze schon sein



  • Es gibt EnumProcesses und ein Beispiel auf MSDN: http://msdn.microsoft.com/en-us/library/ms682623(VS.85).aspx. War es das was du gesucht hast?



  • Oliver655 schrieb:

    Währe nett enn ihr mir helfen Köntet.

    'wäre' schreibt man ohne 'h'!



  • nwp2 schrieb:

    Es gibt EnumProcesses und ein Beispiel auf MSDN: http://msdn.microsoft.com/en-us/library/ms682623(VS.85).aspx. War es das was du gesucht hast?

    der ansatz ist nicht schlecht aber nicht genau das was ich will (aber läst sich gebrauchen)
    Danke

    @supertux
    Klingt jetz sehr Hart aber wen du Nichts Produktiferes zubieten hast dan halt die Fresse.
    Nicht jeder ist in der Rechtschreibung so gewant wie andere.

    Freundliche Grüsse Oliver

    ps:
    Solche sachen finde ich daneben es ist gut wenn man jemand aufmerksam macht aber dan nichts zum eigentlichen thema beitragen ist einfach daneben



  • @Oliver655: du willst Hilfe, ich helfe dir bei deiner Rechtschreibung. Wenn du aber wie ein beleidigtes 10-jähriges Kind reagierst, wird dir wahrscheinlich nie einer helfen.



  • Oliver655 schrieb:

    @supertux
    Klingt jetz sehr Hart aber wen du Nichts Produktiferes zubieten hast dan halt die Fresse.

    also das ja schon ein starkes stück ich bin selbst nicht der super schreiber, und werd nie ein ghost-writer aber wenn mich jemand auf meinen fehler hinweist kann ich mich dessen glücklich schätzen da ich ihn sonst ewig mach, was jetzt nicht heißt ihr sollt jedes wort auf die gold waage legen. aber jemand zu beschimpfen der dir versucht zu helfen geht eindeutig zu weit...



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C 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.



  • Auch wenn du ziemlich unfreundlich warst werde ich dir helfen. Mit dem Code den ich poste kannst du die PID eines Prozesses herrausfinden (denke ma die wird dir helfen den Prozess zu beenden wenn er nicht mehr laufen darf). Ausserdem kannst du so auch schauen ob der Prozess läuft. Hab mir nicht die Mühe gemacht unnötiges aus dem Code zu entfernen^^. Hoffe du kannst was damit anfangen.

    Solang SetOfPID nicht .empty() ist läuft der Prozess. Achja der Prozessname sollte ohne .exe angegeben werden ;).

    #pragma once
    #include <comdef.h>
    #include <vector>
    #include <windows.h>
    
    PPERF_OBJECT_TYPE FirstObject( PPERF_DATA_BLOCK PerfData )
    {
        return( (PPERF_OBJECT_TYPE)((PBYTE)PerfData + 
            PerfData->HeaderLength) );
    }
    
    PPERF_OBJECT_TYPE NextObject( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_OBJECT_TYPE)((PBYTE)PerfObj + 
            PerfObj->TotalByteLength) );
    }
    
    PPERF_INSTANCE_DEFINITION FirstInstance( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfObj + 
            PerfObj->DefinitionLength) );
    }
    
    PPERF_INSTANCE_DEFINITION NextInstance( 
        PPERF_INSTANCE_DEFINITION PerfInst )
    {
        PPERF_COUNTER_BLOCK PerfCntrBlk;
    
        PerfCntrBlk = (PPERF_COUNTER_BLOCK)((PBYTE)PerfInst + 
            PerfInst->ByteLength);
    
        return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfCntrBlk + 
            PerfCntrBlk->ByteLength) );
    }
    
    PPERF_COUNTER_DEFINITION FirstCounter( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_COUNTER_DEFINITION) ((PBYTE)PerfObj + 
            PerfObj->HeaderLength) );
    }
    
    PPERF_COUNTER_DEFINITION NextCounter( 
        PPERF_COUNTER_DEFINITION PerfCntr )
    {
        return( (PPERF_COUNTER_DEFINITION)((PBYTE)PerfCntr + 
            PerfCntr->ByteLength) );
    }
    
    PPERF_COUNTER_BLOCK CounterBlock(PPERF_INSTANCE_DEFINITION PerfInst)
    {
    	return (PPERF_COUNTER_BLOCK) ((LPBYTE) PerfInst + PerfInst->ByteLength);
    }
    
    #define TOTALBYTES    64*1024
    #define BYTEINCREMENT 1024
    
    #define PROCESS_OBJECT_INDEX	230
    #define PROC_ID_COUNTER			784
    
    void GetProcessID(LPCTSTR pProcessName, std::vector<DWORD>& SetOfPID)
    {
    	PPERF_DATA_BLOCK pPerfData = NULL;
        PPERF_OBJECT_TYPE pPerfObj;
        PPERF_INSTANCE_DEFINITION pPerfInst;
        PPERF_COUNTER_DEFINITION pPerfCntr, pCurCntr;
        PPERF_COUNTER_BLOCK PtrToCntr;
        DWORD BufferSize = TOTALBYTES;
        DWORD i, j;
    	LONG k;
    
        pPerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
    
    	char szKey[32];
    	sprintf(szKey,"%d %d",PROCESS_OBJECT_INDEX, PROC_ID_COUNTER);
    	LONG lRes;
        while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                                   szKey,
                                   NULL,
                                   NULL,
                                   (LPBYTE) pPerfData,
                                   &BufferSize )) == ERROR_MORE_DATA )
        {
    
            BufferSize += BYTEINCREMENT;
            pPerfData = (PPERF_DATA_BLOCK) realloc( pPerfData, BufferSize );
        }
    
        pPerfObj = FirstObject( pPerfData );
    
        for( i=0; i < pPerfData->NumObjectTypes; i++ )
        {
    
    		if (pPerfObj->ObjectNameTitleIndex != PROCESS_OBJECT_INDEX)
    		{
    			pPerfObj = NextObject( pPerfObj );
    			continue;
    		}
    
    		SetOfPID.clear();
    
            pPerfCntr = FirstCounter( pPerfObj );
    
            pPerfInst = FirstInstance( pPerfObj );
    
    		_bstr_t bstrProcessName,bstrInput;
    
            for( k=0; k < pPerfObj->NumInstances; k++ )
            {
    			pCurCntr = pPerfCntr;
    			bstrInput = pProcessName;
    			bstrProcessName = (wchar_t *)((PBYTE)pPerfInst + pPerfInst->NameOffset);
    			if (!stricmp((LPCTSTR)bstrProcessName, (LPCTSTR) bstrInput))
    			{
    
    				for( j=0; j < pPerfObj->NumCounters; j++ )
    				{
    					if (pCurCntr->CounterNameTitleIndex == PROC_ID_COUNTER)
    					{
    						PtrToCntr = CounterBlock(pPerfInst);
    						DWORD *pdwValue = (DWORD*)((LPBYTE) PtrToCntr + pCurCntr->CounterOffset);
    						SetOfPID.push_back(*pdwValue);
    						break;
    					}
    
    					pCurCntr = NextCounter( pCurCntr );
    				}
    			}
    
                pPerfInst = NextInstance( pPerfInst );
            }
        }
    	free(pPerfData);
    	RegCloseKey(HKEY_PERFORMANCE_DATA);
    }
    

    btw: ist nur teils selbst geschrieben.

    #include "GetPID.h"
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      std::vector<DWORD> SetOfPID;
      GetProcessID("firefox", SetOfPID); 
    
      while(!SetOfPID.empty())
      {
         GetProcessID("firefox", SetOfPID);
         cout << "PID of firefox.exe: " << SetOfPID.back() << endl;
         ...do something...
      }
    
      return 0;
    }
    

    Eine frage hätt ich dann aber auch noch 😛 . Ich Programmiere C++ und weiss jetzt nicht ob es nen std::vector in C gibt. Kann mir da Jemand weiterhelfen? 😛



  • Hallo,

    Eine frage hätt ich dann aber auch noch 😛 . Ich Programmiere C++ und weiss jetzt nicht ob es nen std::vector in C gibt. Kann mir da Jemand weiterhelfen? 😛

    Nein, den gibt es nicht, vector ist eine Klasse, und C kennt keine Klassen. Dann eben ein Array, gegebenenfalls dynamisch mit malloc arbeiten, oder selbstgeschriebene (oder irgendwo besorgte) verkettete Liste, oder, oder...

    MfG,

    Probe-Nutzer



  • Ok darauf hätt ich selbst kommen können. Danke 🙂


Anmelden zum Antworten