Avatar billede esf_spike Nybegynder
23. april 2002 - 15:03 Der er 30 kommentarer og
2 løsninger

Listing af åbne processor

Jeg vil gerne vide hvilket API kald jeg skal bruge for at få en liste over åbne processor i systemet i formatetet "prog1.exe prog2.exe prog3.exe".
Et eksempel med et cout output i ovenstående format ville være dejligt.
Det må gerne bruge MFC, jeg bruger vc++ som compiler.
Avatar billede killer_bee Nybegynder
24. april 2002 - 12:00 #1
lytter med :)
Avatar billede kamikaze Nybegynder
25. april 2002 - 01:31 #2
Du skal bruge EnumProcesses();

Slå det op i MSDN :-)
Avatar billede esf_spike Nybegynder
25. april 2002 - 01:52 #3
Har jeg gjort, nogen lav mig et eksempel!! :(
Avatar billede laffe Nybegynder
30. april 2002 - 00:00 #4
#include <Psapi.h>


  HMODULE ModuleArray[100];
  DWORD PIDArray[100];
  DWORD cbNeeded,cbNeeded1;
  char PathBuffer[512];
  int NumOfProcesses,NumOfModules;
  if (EnumProcesses(PIDArray,sizeof(PIDArray),&cbNeeded))
  {
    //Memo1->Lines->Add("EnumProcesses OK");
    NumOfProcesses = cbNeeded / sizeof(DWORD);
    //Memo1->Lines->Add(IntToStr(NumOfProcesses)+" Processes Found");

    for (int i=2; i<NumOfProcesses; i++)
    {
      //Memo1->Lines->Add(IntToStr(PIDArray[i]));
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS    ,false,PIDArray[i]);
      if (!hProcess)
        continue;
      if (EnumProcessModules(hProcess,ModuleArray,sizeof(ModuleArray),&cbNeeded1))
      {
        //Memo1->Lines->Add("ProcessModules OK");
        NumOfModules = cbNeeded1 / sizeof(HMODULE);
        for (int j=0; j<NumOfModules; j++)
        {
          GetModuleFileNameEx(hProcess,ModuleArray[j],PathBuffer,511);
          //Memo1->Lines->Add(PathBuffer);

        }
      }else
      {
        //Memo1->Lines->Add("ProcessModules Failed");
      }
      CloseHandle(hProcess);
    }
  }else
  {
    //Memo1->Lines->Add("EnumProcesses Failed");
  }
Avatar billede esf_spike Nybegynder
30. april 2002 - 02:12 #5
Gider du sætte det op så jeg kan compile det direkte?
Vil gerne ha alle processer outputtet i formatet "prog1.exe prog2.exe prog3.exe", altså på én linie.
tak
Avatar billede killer_bee Nybegynder
30. april 2002 - 09:10 #6
affe >> er det kode du kom med ik fra Borland Builder?.. jeg har prøvet at "lege" lidt med den i MFC  men den gider ik sluge den..
Avatar billede laffe Nybegynder
30. april 2002 - 09:38 #7
Jo det er fra CBuilder, men jeg har udkommenteret alt hvad der har med CBuilder at gøre.
Avatar billede laffe Nybegynder
30. april 2002 - 09:40 #8
>esf_spike. Jeg har ikke vc++ installeret. Måske kan killer_bee lave det.
Avatar billede killer_bee Nybegynder
30. april 2002 - 09:41 #9
hmmm.. I MFC 'ved' den ikke hva <Psapi.h> er og heller ikke EnumProcesses eller EnumProcessModules..
Avatar billede killer_bee Nybegynder
30. april 2002 - 10:05 #10
laffe Jeg får 3  errors :
testerDlg.obj : error LNK2001: unresolved external symbol _GetModuleBaseNameA@16
testerDlg.obj : error LNK2001: unresolved external symbol _EnumProcessModules@16
testerDlg.obj : error LNK2001: unresolved external symbol _EnumProcesses@12
Debug/tester.exe : fatal error LNK1120: 3 unresolved externals
Avatar billede laffe Nybegynder
30. april 2002 - 10:25 #11
du skal includere Psapi.lib
Avatar billede killer_bee Nybegynder
30. april 2002 - 10:30 #12
har gjort..
Avatar billede killer_bee Nybegynder
30. april 2002 - 10:38 #13
Ups.. var lidt for hurtig.. havde glemt at include 1 sted .. nu virker den ..
Jeg har ik brugt din kode laffe . men dette :

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.
CString processes;
    for ( i = 0; i < cProcesses; i++ )

    {
   
   
    char szProcessName[MAX_PATH] = "unknown";

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                  PROCESS_VM_READ,
                                  FALSE, aProcesses[i] );

    // Get the process name.

    if ( hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
            &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName,
                              sizeof(szProcessName) );
        }
    }

    // Print the process name and identifier.

    processes += (CString)szProcessName + "," ;
   

    CloseHandle( hProcess );

}

HUSK AT INCLUDE .LIB og .H filen
Avatar billede killer_bee Nybegynder
30. april 2002 - 10:49 #14
Det virker .
Avatar billede killer_bee Nybegynder
30. april 2002 - 11:01 #15
laffe >> har lige testet din kode.. DAMN hehe man få alt at vide .. alle DLLs med paths .. meget nice  hvis man har brug for det...
Den giver din process navn og alle de DLLs den bruger .. alt med full path..
Avatar billede killer_bee Nybegynder
30. april 2002 - 11:45 #16
Måske sku jeg smide et svar ??

Jeg har lavet lidt formatering på din kode laffe så den ser sådan ud:


  HMODULE ModuleArray[100];
  DWORD PIDArray[100];
  DWORD cbNeeded,cbNeeded1;
  char PathBuffer[512];
  int NumOfProcesses,NumOfModules;

      CString processes;
    CString tmp;

    if (EnumProcesses(PIDArray,sizeof(PIDArray),&cbNeeded))
    {
        processes +="EnumProcesses OK\n\n-------------------------\n";
        NumOfProcesses = cbNeeded / sizeof(DWORD);

        tmp.Format("%d Processes Found\n-------------------------\n",NumOfProcesses);
        processes += tmp;

        for (int i=2; i<NumOfProcesses; i++)
        {
           
            tmp.Format("Process ID : %d\n",PIDArray[i]);
            processes += tmp;
            HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS    ,false,PIDArray[i]);
            if (!hProcess)
              continue;
            if (EnumProcessModules(hProcess,ModuleArray,sizeof(ModuleArray),&cbNeeded1))
            {
              processes += "ProcessModules OK\n";
              NumOfModules = cbNeeded1 / sizeof(HMODULE);
              for (int j=0; j<NumOfModules; j++)
              {
                GetModuleFileNameEx(hProcess,ModuleArray[j],PathBuffer,511);
   
                processes += (CString)PathBuffer + ",\n" ;

              }
              processes +="-------------------------\n\n";
            }else
            {
              processes +="ProcessModules Failed\n";
            }
            CloseHandle(hProcess);
        }
      }else
      {
        processes += "EnumProcesses Failed";
      }
Avatar billede killer_bee Nybegynder
30. april 2002 - 11:45 #17
svar
Avatar billede laffe Nybegynder
30. april 2002 - 11:59 #18
Jeps. Det gør den nemlig.
Avatar billede killer_bee Nybegynder
30. april 2002 - 12:04 #19
meget nice..  :o) Jeg troede ikke at Gates vil gå med til noget i den stil  :) hehe at frigive path som hedder noget med c:\system
Avatar billede esf_spike Nybegynder
30. april 2002 - 16:23 #20
Eh, ja - jeg skal bruge koden så jeg kan sætte den ind i visual c++ 6.0 og compile den så jeg får outputtet i éen linie i formatet "prog1.exe prog2.exe" osv. og det skal ligge i en string jeg kan returne. ingen point før det. jeg sætter den lige op til 100 point så.
Avatar billede esf_spike Nybegynder
30. april 2002 - 16:25 #21
Og nåja, det må _IKKE_ bruge MFC, og helst ikke Cstrings.
Avatar billede esf_spike Nybegynder
30. april 2002 - 16:25 #22
(std::string's er ok)
Avatar billede killer_bee Nybegynder
30. april 2002 - 16:34 #23
esf..  Du skal bare ændre der hvor jeg skriver CString til string eller det du nu skal/kan bruge. Du indsætter koden i din project , jeg regner med at dette skal udføres f.eks. når du trykker på et knap?

HUSK AT INCLUDE .LIB og .H filen

#include <Psapi.h>



    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.
CString processes;
    for ( i = 0; i < cProcesses; i++ )

    {
   
   
    char szProcessName[MAX_PATH] = "unknown";

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                  PROCESS_VM_READ,
                                  FALSE, aProcesses[i] );

    // Get the process name.

    if ( hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
            &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName,
                              sizeof(szProcessName) );
        }
    }

    // Print the process name and identifier.

    processes += (CString)szProcessName + "," ;
   

    CloseHandle( hProcess );

}
Avatar billede esf_spike Nybegynder
30. april 2002 - 16:49 #24
Cannot open include file: 'Psapi.h': No such file or directory
hvor får jeg det SDK?
Avatar billede killer_bee Nybegynder
30. april 2002 - 17:35 #25
Ok. Under Tools->Options på Directories fanebladet er der nogle paths. du skal finde det path på din comp hvor 'Psapi.h' er og skrive den ind. Det er en dropdown menu hvor man kan vælge bl.a. 'Include files' og 'Source Files' skriv/browse det samme path for dem begge.

Under menuen  Project->Settings på faneblsdet som hedder 'Link' der hvor der står 'Object/Library modules:' skriv navnet på det lib du mangler (psapi.lib)
Avatar billede esf_spike Nybegynder
30. april 2002 - 17:48 #26
Ah, virker.
Hm, killer_bee, hvor mange point vil du have siden laffe skrev core koden?
Du må selv bestemme, så kan i selv skændes. :-)
Avatar billede killer_bee Nybegynder
30. april 2002 - 18:10 #27
det må du bestemme :) ud fra vores indsats vil jeg gå ud fra.
Avatar billede killer_bee Nybegynder
30. april 2002 - 21:14 #28
Tak for points.. :)
Avatar billede esf_spike Nybegynder
30. april 2002 - 21:21 #29
Det skulle ha' været omvendt :-(
Altså jeg kan godt lave et nyt spørgsmål og så give dig 40 points mere, men det ville være kinda nytteløst, men hvis du vil have dem så sig til.
Avatar billede killer_bee Nybegynder
30. april 2002 - 21:37 #30
Det fint.. points er ik det vigtigste :)
Avatar billede george Nybegynder
12. februar 2003 - 19:58 #31
Undskyld jeg lige blander mig, men hvor er det lige jeg kan finde .lib filen til det I taler om her ?
Avatar billede george Nybegynder
12. februar 2003 - 21:44 #32
Fandt selv Psapi.lib filen på nettet under : http://d0.phys.washington.edu/Projects/l3/auto_start/building/Default.htm

Jeg har oprettet et nyt spørgsmål da jeg stadig har problemer :
http://www.eksperten.dk/spm/316743
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester