Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [c] elenco processi aperti con relativo pid

    ciao a tutti... cercando in giro sono riuscito a trovare questo pezzo di codice che mi stampa a video l'elenco dei processi che ho aperto...
    problema: capita che di alcuni programmi non mi da il nome ma solo il pid... mi chiedo perche? cercando in giro ho letto che fa cosi perche il programma del quale non mi da il nome è a 64 bit e non riesce a "gestirlo".. è vero?? nel caso come posso fare per ottenere un elenco completo dei programmi aperti sul pc (sia a 32 che 64 bit)??

    ecco il codice che ho usato..

    codice:
    #include <windows.h>
    #include <psapi.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *  GetProcessName(DWORD processID ,char * szProcessName, 
    DWORD bufsiz)
    {
        // Get a handle to the process.
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | 
    PROCESS_VM_READ, 0, processID );
    	szProcessName[0]='\0';
        // Get the process name.
        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
    &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName,
    bufsiz );
            }
            else return NULL;
        }
        else return NULL;
        CloseHandle( hProcess );
    	return szProcessName;
    }
    
    
    
    int main(int argc, char**argv)
    {
    
    	char szProcessName[MAX_PATH];
    	DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), 
    &cbNeeded ) )
            return 1;
        cProcesses = cbNeeded / sizeof(DWORD);
    	for ( i = 0; i < cProcesses; ++i )
    	{
    		GetProcessName(aProcesses[i],szProcessName,
    MAX_PATH);
    		printf("%ld %s\n",aProcesses[i], szProcessName);
    	}
    
    	return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Penso proprio tu debba usare la API

    EnumProcessModulesEx
    http://msdn.microsoft.com/en-us/libr...sktop/ms682633(v=vs.85).aspx

    indicando il flag

    LIST_MODULES_ALL
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ecco il nuovo codice usando la funzione EnumProcessModulesEx
    problema mi dice "undefined reference to `EnumProcessModulesEx' "... in build options nalla parte di linker settings ho aggiunto sia la libreria kernel32 che la psapi... pero mi da lo stesso errore.. come posso risolvere?? preciso che uso code blocks...

    codice:
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <psapi.h>
    
    void PrintProcessNameAndID( DWORD processID )
    {
        TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
        DWORD dwFilterFlag = 0x03;
        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if ( EnumProcessModulesEx( hProcess, &hMod, sizeof(hMod),
     &cbNeeded, dwFilterFlag) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
            }
        }
    
        _tprintf( TEXT("%s  (PID: %ld).\n"), szProcessName, processID );
        CloseHandle( hProcess );
    }
    
    int main()
    {
        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            return 0;
        cProcesses = cbNeeded / sizeof(DWORD);
        for ( i = 0; i < cProcesses; i++ )
        {
            if( aProcesses[i] != 0 )
                PrintProcessNameAndID( aProcesses[i] );
        }
        return 0;
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    1) devi compilare il tuo progetto a 64 bit altrimenti la EnumProcessModulesEx funziona come la EnumProcessModules

    2) probabilmente devi aggiornare il sdk del tuo ambiente di compilazione; se compili con Visual C++ 2010 non ci sono problemi
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    mmmm... ok....
    tu sai come fare con code block??
    o mi conviene usare visual studio 2012??

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da indovinello
    tu sai come fare con code block??
    No ... non lo so e non ho installato CB ...

    o mi conviene usare visual studio 2012??
    Questo non lo so ... devi decidere tu ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    ho cercato per code block è sto impazzendo non ci capisco nulla... provo a scaricare visual studio premium 2012 poi provo...

  8. #8
    alla fine ho deciso di cambiare strada perchè non capivo cosa dovevo fare... è ho utilizzato
    FindWindow per trovare l'hwnd dando il nome della finestra e poi SetForegroundWindow per portarla in primo piano...
    grazie delle risp...
    si puo chiudere...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.