Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Lista de procesos de mi ordenador (https://www.clubdelphi.com/foros/showthread.php?t=38370)

Reinery 12-12-2006 19:47:10

Lista de procesos de mi ordenador
 
uuf pued llevo dia y he buscado pero cuando he estado cerca pues retorno al inicio, mi problema es que kisiera hacer una lista de procesos en mi programa.

bueno gracias por adelantado :)

Bicho 12-12-2006 21:14:35

Hola, no habras buscado mucho por aquí, ¿no?
Mira al final de esta pagina tienes este hilo por ejemplo, y si usas el buscador encontrarás más seguro

Espero te sirva.

Saludos

seoane 12-12-2006 22:54:24

Aquí también tratamos del tema, pero en C. Puede que te sea de utilidad.

http://www.clubdelphi.com/foros/showthread.php?t=37988

Reinery 13-12-2006 00:43:14

ok, pero necesito ayuda en esto ahora
 
tengo este codigo, que le traduje desde delphi a builder, pero ahora me da un error al compilar con esta lines si pudieran ayudarme una ves mas
gracias.. ;)

void GetMemoryProcess()
{
HANDLE foto;
tagPROCESSENTRY32 datos;
int r=1;

datos.dwSize = sizeof(tagPROCESSENTRY32);
foto = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

while (Process32Next(foto, &datos)!=0)
{
//en esta linea del listview me da un error
Form1->ListView1->Items->Add(IntToStr(datos.th32ProcessID));
Form1->ListView1->Items->Item[r]->SubItems->Add(datos.szExeFile);
r++;
}

CloseHandle(foto);
}

seoane 13-12-2006 00:46:02

:D Lo que seria estupendo es que nos dijeras que error te da al compilar

Reinery 13-12-2006 00:59:11

bueno estu mirando y cambien lo que tenia.
ya no me da el error
pero no me sale los nombre de los procesos

while (Process32Next(foto, &datos)!=0)
{

Form1->ListView1->AddItem(IntToStr(datos.th32ProcessID),NULL);
Form1->ListView1->Items->Item[r]->SubItems->Add(".EXE");

r++;
}

wako13 14-12-2006 03:04:26

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

Codigo by _Leo

Saludos Cordiales


Reinery 16-12-2006 01:15:05

gracias a todos por la ayuda
 
bueno aki dejo lo que finalmente obtuve ademas busque otros hilos en este sitio que me sirvieron para mi final.
hay que poner un listview y adicionarle dos columnas ademas en viewstyle ponele vsreport bueno ojala le sirva a alguien :cool:

void GetMemoryProcess()//Para listar los procesos
{
HANDLE foto;
tagPROCESSENTRY32 datos;
int Indice=0;

datos.dwSize = sizeof(tagPROCESSENTRY32);
foto = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

while (Process32Next(foto, &datos)!=0)
{
Form1->ListView1->Items->Add()->Caption=IntToStr(datos.th32ProcessID);
Form1->ListView1->Items->Item[Indice]->SubItems->Add(datos.szExeFile);
Indice++;
}

CloseHandle(foto);
}


La franja horaria es GMT +2. Ahora son las 14:38:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi