tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
1306
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    zacharyy zacharyy ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    4
    Hallo liebe Community,

    ich würde gerne den Pfad eines Prozesses, der gerade (im Taskmanager) läuft, als string speichern.
    Sodass ich hinterher an die Dateien komme des Ordners komme, wo auch die .exe drin liegt.

    Sinn und Zweck?
    Ich möchte von einem Spiel die Configs auslesen.
    Das Spiel wäre in diesem Falle Counter-Strike.

    Wenn die hl.exe gestartet wurde, soll sich mein Programm den Pfad von der hl.exe raussuchen (also z.B.: C:\Spiele\Steam\steamapps\accountname\counter-strike\)und dann die config.cfg, die im selben Ordner liegt, kopieren.

    Hat jemand eine Ahnung wie ich das "leicht und effizient" lösen könnte?

    Danke!

    Mit freundlichen Grüßen
    zacharyy
     

  2. #2
    zacharyy zacharyy ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    4
    Habe jetzt folgenden Code im Inet gefunden:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    BOOL GetProcessModule(DWORD dwPID, DWORD dwModuleID, LPMODULEENTRY32 lpMe32, DWORD cbMe32)
    {
        BOOL bRet = FALSE;
        BOOL bFound = FALSE;
        HANDLE hModuleSnap = NULL;
        MODULEENTRY32 me32 = {0};
        ZeroMemory(&me32,sizeof(MODULEENTRY32));
        hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
        if (hModuleSnap == INVALID_HANDLE_VALUE)
            return (FALSE);
        me32.dwSize = sizeof(MODULEENTRY32);
        if (Module32First(hModuleSnap, &me32))
        {
            do
            {
                if (me32.th32ProcessID == dwPID)
                {
                    CopyMemory (lpMe32, &me32, cbMe32);
                    bFound = TRUE;
                }
            }
            while (!bFound && Module32Next(hModuleSnap, &me32));
            bRet = bFound;
        }
        else
            bRet = FALSE;
        CloseHandle(hModuleSnap);
        return bRet;
    }
     
    BOOL ListProcesses()
    {
        HANDLE hProcessSnap = 0;
        HANDLE hToken;
        PROCESSENTRY32 pe32 = {0};
        DWORD dwPriorityClass;
        BOOL bGotModule = FALSE;
        HANDLE hProcess;
        MODULEENTRY32 me32 = {0};
        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if(hProcessSnap == INVALID_HANDLE_VALUE)
            return FALSE;
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if(Process32First(hProcessSnap,&pe32))
        {
            do
            {
                ZeroMemory(&me32,sizeof(MODULEENTRY32));
                hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
                bGotModule = GetProcessModule(pe32.th32ProcessID, pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));
                dwPriorityClass = GetPriorityClass(hProcess);
                cout<<"File name: "<<pe32.szExeFile<<endl;
                cout<<"Path: "<<me32.szExePath<<endl;
                CloseHandle(hProcess);
            }while(Process32Next(hProcessSnap,&pe32));
        }
        return bGotModule;
    }

    Wie kriege ich das jetzt hin, das er NUR die "hl.exe" aus meinem TaskManager sucht und dann auch nur den PFAD von der "hl.exe" als string speichert?
     

  3. #3
    mvp87 mvp87 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Hallo,
    hier wird überprüft ob ein Prozess läuft:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    int IsOpen(BOOL &bOpen)
    {   
        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i = 0;
     
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        {
            //fehler
        }       
     
        // Calculate how many process identifiers were returned.
        cProcesses = cbNeeded / sizeof(DWORD);
     
        for ( i = 0; i < cProcesses; i++ )
        {
            IsInProcessList(aProcesses[i]);     
        }
    }
     
    int IsInProcessList(DWORD dwProcessID)
    {
        TCHAR szProcessName[MAX_PATH] = _T("unknown");
        CString strExe= _T("hl.exe");
        
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                           PROCESS_VM_READ,
                                           FALSE, dwProcessID );
     
        if(hProcess != NULL)
        {
            HMODULE hMod;
            DWORD cbNeeded;
     
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                 &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, 
                                   sizeof(szProcessName) );
     
                if(strExe.CompareNoCase(szProcessName) == 0)
                {
                    //HL.exe Prozess gefunden! 
                }
            }       
        }
     
        CloseHandle( hProcess );    
    }

    Du kannst dir für die Schleife, die IsInProcessList noch eine Abbruchbedingung einfallen lassen (z.B.: BOOL Wert setzen, wenn Prozess gefunden)

    Zum auslesen des Pfades findest du alle wichtigten Informationen hier:
    http://msdn.microsoft.com/en-us/libr...98(VS.85).aspx
     

  4. #4
    zacharyy zacharyy ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    4
    Hey! Danke erstmal fürs Antworten.

    Wo genau liest dein Code denn den Pfad von der hl.exe aus?
    Hier? "TCHAR szProcessName[MAX_PATH] = _T("unknown");"

    Und leider kriege ich tausende Errors mit meinem Dev-C++, kannst du den Code evtl. dafür optimieren?
    Errors sind folgende
    error C2065: '_T' : undeclared identifier
    error C2440: 'initializing' : cannot convert from 'int' to 'char [260]'
    There are no conversions to array types, although there are conversions to references or pointers to arrays
    error C2065: 'CString' : undeclared identifier
    error C2146: syntax error : missing ';' before identifier 'strExe'
    error C2065: 'strExe' : undeclared identifier
    error C2065: 'EnumProcessModules' : undeclared identifier
    error C2065: 'GetModuleBaseName' : undeclared identifier
    error C2228: left of '.CompareNoCase' must have class/struct/union type
    error C2065: 'EnumProcesses' : undeclared identifier
    Danke schonmal!

    ||Edit||

    Ich habe gerade folgenden Code über Google gefunden:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    [/#include <Psapi.h>
     
    #pragma comment(lib, "psapi.lib") // Nur Visual Studio: psapi.lib einbinden
     
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
    {
        DWORD lpdwProcessId;
        HANDLE hProcessHandle;
        GetWindowThreadProcessId(hWnd, &lpdwProcessId);   
        hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
        GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
        CloseHandle(hProcessHandle);
    }

    Ist genau das was ich suche. Wie kriege ich denn jetzt den Handle von der "hl.exe"?
    Danach würde ich den Pfad gern weiterverarbeiten, im Sinne von Configs auslesen.
    Geändert von zacharyy (26.02.09 um 14:27 Uhr)
     

Ähnliche Themen

  1. Speicherbereich eines Prozesses
    Von Ichbinalex im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 08.06.09, 15:00
  2. Verbindung eines Prozesses überprüfen
    Von nagydaniel im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 16.08.07, 10:24
  3. Pfad eines belibigen Prozesses
    Von SpoileD im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 13.05.07, 01:31
  4. Ordner eines Prozesses ermitteln
    Von kai2004 im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 22.11.06, 08:33
  5. PID eines Prozesses ermitteln
    Von Caruso_Nix im Forum Java
    Antworten: 6
    Letzter Beitrag: 23.11.04, 13:35

Stichworte