 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Quid Invitado
|
Publicado: Vie 20 Jun, 2003 9:02 pm Asunto: listar procesos |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 24 Jun, 2003 10:57 am Asunto: |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Lun 01 Dic, 2008 10:42 pm Asunto: |
|
|
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! 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 02 Dic, 2008 3:47 am Asunto: |
|
|
| 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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mar 02 Dic, 2008 4:12 am Asunto: |
|
|
_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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 02 Dic, 2008 7:01 am Asunto: |
|
|
| 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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mar 02 Dic, 2008 7:16 am Asunto: |
|
|
_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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 05 Dic, 2008 2:32 am Asunto: |
|
|
| 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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 05 Dic, 2008 4:05 pm Asunto: |
|
|
Ok? _Leo seria un honor y te agradezco infinitamente _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|