Skocz do zawartości

skanowanie procesów


Oddity

Recommended Posts

Gdzieś na msdn.microsoft.com widziałem przykład, jak to się robi pod VC++ 6. W VC++ .net jest funkcja EnumProcess, jak już wcześniej wspomniałem. Żeby jednak się nie męczyć, radzę skorzystać z EnumWindows i sprawdzać tytuły każdego okna w systemie (wbrew pozorom nie zabiera to dużo czasu). Więcej informacji na ten temat jest w dokumentacji.

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

Co prawda temat stary, ale zapisalem sie na forum dopiero niedawno, a mam nieodparta pokuse dodania swoich 2 groszy :)

Wiec tak.. procesy wbrew pozorom odczytuje sie dosc latwo, jak bede w domu to lookne gdzies mam malutki programik listujacy procesy, to jest kwestia kilku funkcji, ktore sa opisane w MSDN ale nie pamietam ich nazw..
Trzeba tez dodac ze ten spsob nie jest idealny, bo klient moze sobie porobic kopie execa o roznych nazwach i odpalac kazda z osobna, co niweczy plany programisty. Trzeba by wtedy dokladniej skanowac kazdy proces nie tylko pod katem nazwy ale tez innych rzeczy, ale to z kolei wolniejsze.

Druga sprawa to bardzo dziwi mnie, ze nikt nie wspomnial o narzedziu chyba stworzonym do celu jaki przyswieca watkowi, a mianowicie o Mutex'ach.. Tez nie podam teraz kodu bo nie ucze sie tego na pamiec, ale wystarczy wpisac to slowo na msdn.microsoft.com i powinno "conieco" znalezc. Jutro jesli nie zapomne wrzuce jakis przykladowy kod.
To rozwiazanie nie ma wady poprzedniego.

Link do komentarza
Udostępnij na innych stronach

Najpierw procesy:

void AddProcess(HWND lv)
{
   LVITEM item;
   PROCESSENTRY32 entry;
   int idx = 0;

   HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   item.mask = LVIF_TEXT;
   item.iItem = idx;
   item.iSubItem = 0;
   item.pszText = (char*)LocalAlloc(0, MAX_PATH);

   entry.dwSize = sizeof(entry);
   if (Process32First(snapshot, &entry))
   {
      wsprintf(item.pszText, "%X", entry.th32ProcessID);
      ListView_InsertItem(lv, &item);
      ListView_SetItemText(lv, idx, 1, entry.szExeFile);
      idx++;
   }
   entry.dwSize = sizeof(entry);
   while (Process32Next(snapshot, &entry))
   {
      item.iItem = idx;
      wsprintf(item.pszText, "%X", entry.th32ProcessID);
      ListView_InsertItem(lv, &item);
      ListView_SetItemText(lv, idx, 1, entry.szExeFile);
      idx++;
      entry.dwSize = sizeof(entry);
   }

   LocalFree(item.pszText);
   CloseHandle(snapshot);
}

Funkcja jako parametr przyjmuje handle kontrolki ListView i wypelnia ja procesami (PID i nazwa pliku).
W MSDN'ie pod ktoras z funkcji Process32* widzialem jeszcze prostszy przyklad.

A teraz mutexy:

HANDLE mutex = CreateMutex(NULL, TRUE, "jakis_unikalny_string");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
    if(mutex)
        CloseHandle(mutex);
    return 0;
}

// program glowny...

ReleaseMutex(mutex);
CloseHandle(mutex);
Link do komentarza
Udostępnij na innych stronach

  • 2 months later...
  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...