Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

listar procesos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: listar procesos Responder citando

Hola, estoy intentando que mi programa liste los procesos activos de windows (XP para ser concretos).

Como puedo hacer eso?
Solo necesito listar sus nombres, aunque estaria bien poder tambien obtener las rutas de sus ejecutables o algun que otro dato tipico...

Un saludo, gracias, y mi mas sincera enhorabuena a los que mantienen esta super web

Quid
Volver arriba
Mensaje    Asunto: Responder citando

Hola:

Si solo necesitas listar los procesos sin la ruta puedes hacerlo con el siguiente código, la ventaja es que funciona en todas las versiones de Windows con cualquier versión de C++Builder. Para probarlo solo necesitas añadir un TListBox (ListBox1) y lo siguiente en el constructor del form:
Código:
// Añadimos:  #include<Tlhelp32.h>

PROCESSENTRY32 proc = { sizeof(proc) };
HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( hSysSnapshot != reinterpret_cast<HANDLE>(-1)
    && Process32First(hSysSnapshot, &proc) )
{
   ListBox1->Clear();
   do
   {
      char str[512];
      wsprintf(str, "%s  (id=%lu)", proc.szExeFile, proc.th32ProcessID);
      ListBox1->Items->Add(str);
   } while ( Process32Next(hSysSnapshot, &proc) );
}
CloseHandle (hSysSnapshot);

Y ya si necesitas la ruta y poder obtener mas información sobre cada proceso puedes usar lo siguiente, aunque solo funciona en NT/2000/XP. En el ejemplo solo se obtiene la ruta como dato extra a la de arriba, pero puedes obtener mucha mas información, para ello mira el apartado PSAPI del API.
Código:
//--- Cargamos dinamicamente la libreria "psapi.dll"
//  (En versiones mas actualizadas (BCB6) no necesitamos hacer esto.
//   Solo añadir #include<psapi.h> y la libreria "psapi.lib")
typedef BOOL  (__stdcall *PFEnumProcesses)(DWORD*,DWORD,DWORD*);
typedef BOOL  (__stdcall *PFEnumProcessModules)(HANDLE,HMODULE*,DWORD,LPDWORD);
typedef DWORD (__stdcall *PFGetModuleFileNameEx)(HANDLE,HMODULE,LPTSTR,DWORD);

PFEnumProcesses        fEnumProcesses;
PFEnumProcessModules fEnumProcessModules;
PFGetModuleFileNameEx  fGetModuleFileNameEx;

HINSTANCE hLib = LoadLibrary("psapi.dll");
if (hLib)
{
    fEnumProcesses = reinterpret_cast<PFEnumProcesses>(
            GetProcAddress(hLib, "EnumProcesses") );
    fEnumProcessModules = reinterpret_cast<PFEnumProcessModules>(
            GetProcAddress(hLib, "EnumProcessModules") );
    fGetModuleFileNameEx = reinterpret_cast<PFGetModuleFileNameEx>(
            GetProcAddress(hLib, "GetModuleFileNameExA") );

    if (fEnumProcesses && fEnumProcessModules && fGetModuleFileNameEx)
    {
        //--- Obtenemos la lista de indentificadores de proceso
        DWORD aProcesses[1024], cbNeeded, cProcesses, i;
        if (!fEnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
            return;

        //--- Calculamos cuantos indentificadores fueron devueltos
        cProcesses = cbNeeded / sizeof(DWORD);

        //--- Mostramos información de cada proceso
        ListBox1->Clear();
        for (i=0; i<cProcesses; i++)
        {
            char    szProcessName[MAX_PATH] = "desconocido";
            DWORD   processID = aProcesses[i];
            HANDLE  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION
                        | PROCESS_VM_READ, FALSE, processID);
            HMODULE hMod;

            if (hProcess)
            {
                if (fEnumProcessModules(hProcess, &hMod,
                        sizeof(hMod), &cbNeeded))
                {
                    fGetModuleFileNameEx(hProcess, hMod,
                            szProcessName, sizeof(szProcessName));

                    String str("");
                    str.sprintf("%s (Process ID: %u)",
                            szProcessName, processID);
                    ListBox1->Items->Add(str);
                }
                CloseHandle(hProcess);
            } // if hProcess
        } // for i
    } // if

    FreeLibrary(hLib);
} // if hLib


Saludos:
 _Leo


Ultima edición por _Leo el Lun 01 Dic, 2008 11:44 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola _Leo me gustaria hacer dos preguntas sobre este tema
1.Ud dijo

Cita:
pero puedes obtener mucha mas información, para ello mira el apartado PSAPI del API.

el enlace a caducado o algo similar me dice...aunque no soy ducho con las API's y nunca nos entendemos.
2-Que posibilidades hay de que me me muestre como es eso de mostrar mas informacion sobre los procesos y como hacerlo.?
3-Me pase de la cantidad de preguntas! Embarassed Bueno cuando escribo el codigo superior la cantidad de procesos a mostrar son (ejemplo) 29 y con el codigo de mas abajo (el que muestra las direcciones de los procesos son 20 porque????
muchas gracias por la ayuda
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

ifrit escribió:
el enlace a caducado

Ya he actualizado el enlace.

ifrit escribió:
como es eso de mostrar mas informacion sobre los procesos y como hacerlo.?

Me refiero a la información que podemos ver en el administrador de tareas del sistema. (Incluida la información que está en el menú "Ver -> Seleccionar Columnas..." del administrador de tareas). ¿ Que información es necesario mostrar ?

ifrit escribió:
cuando escribo el codigo superior la cantidad de procesos a mostrar son (ejemplo) 29 y con el codigo de mas abajo (el que muestra las direcciones de los procesos son 20 porque????

Es porque no tenemos privilegios para acceder a alguna información de algunos procesos.. pero el ejemplo lo que trataba de mostrar principalmente como extraer la ruta del proceso..

Lo mejor sería usar una mezcla de los dos ejemplos, extraer una información básica con el de arriba y luego los procesos que sea posible obtener más información con el ejemplo de abajo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo me agrada daria poder mostrar mas informacion
ud dijo
Cita:
Me refiero a la información que podemos ver en el administrador de tareas del sistema. (Incluida la información que está en el menú "Ver -> Seleccionar Columnas..." del administrador de tareas). ¿ Que información es necesario mostrar ?

podria por favor mandarme un ejemplo con toda la informacion que pueda mostrar mi aplicacion , me seria muy util
gracias y mis respetos
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

ifrit escribió:
podria por favor mandarme un ejemplo con toda la informacion que pueda mostrar mi aplicacion

Lo siento, es mucha la información que se puede mostrar y llevaría bastante trabajo. No dispongo de tanto tiempo.. como mucho podría poner _pequeños_ ejemplos de cosas concretas. Si al menos fuese algo en lo que tuviese interés y pudiese aprovechar luego para mi.. pero ya uso un programa para eso, bastante bueno, y difícil de superar en mi opinión: Process Explorer (By Mark Russinovich)

Es cuestión de revisar las referencias del API o algún ejemplo como el siguiente, y poco a poco realizar el trabajo:

[Process viewer]
http://www.codeproject.com/KB/cpp/processviewer.aspx

(Contiene el código fuente, es para Visual C++, pero creo que como guía puede servir)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo es genial el que utilizas ya lo descargue al igual que la url que me dejas abajo sobre las apis relacionadas a los propcesos, ya las vere...
pero no, no pretendia llegarle al talon a ninguno de los dos ejempos que me dejas , solo mostrar los porcesos , cuantos eran , las direcciones, la cantidad de subprocesos , cuanto cargan el sistema y una que otra mas ...
pero me pondre a estudiar un tanto , espero poder seguir contando con el foro en este tema
muchas gracias y mis respetos


EDITADO
_Leo el link de Explorer Process (el primero ) no me deja descargar podrias comprobar el link
gracias
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

ifrit escribió:
el link de Explorer Process (el primero ) no me deja descargar podrias comprobar el link

Todos los enlaces me funcionan correctamente.. y si el problema es con el de "codeproject.com" hay que registrarse (es gratuito) para poder descargar como bien nos notifica al intentar la descarga.

ifrit escribió:
no pretendia llegarle al talon a ninguno de los dos ejempos que me dejas , solo mostrar los porcesos , cuantos eran , las direcciones, la cantidad de subprocesos , cuanto cargan el sistema y una que otra mas ...

Si es solo eso, la próxima semana cuando tenga un poco más de tiempo podría preparar un ejemplo..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ok? _Leo seria un honor y te agradezco infinitamente
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.