Programowanie w języku C/C++ » FAQ

Jak sprawdzić, czy program jest już uruchomiony

  • 2006-09-06 16:37
  • 2 komentarze
  • 1302 odsłony
  • Oceń ten tekst jako pierwszy
Przedstawiam prostą funkcję dzięki której będziecie mogli sprawdzić czy wasz program jest uruchomiony samodzielnie. Czy czasem ktoś nie uruchomił drugiego (nawet z innej lokalizacji):

#include <tlhelp32.h>
 
// ...
 
bool __fastcall AmIAlone()
{
        AnsiString iNazwaProcesu = ExtractFileName(Application->ExeName);
        HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        PROCESSENTRY32* processInfo = new PROCESSENTRY32;
        processInfo->dwSize = sizeof(PROCESSENTRY32);
        int process_count = 0;
        BOOL Process32NextRetVal = Process32First(hSnapShot, processInfo);
        while (process_count < 2 && Process32NextRetVal)
        {
                if (AnsiString().sprintf("%s",processInfo->szExeFile).LowerCase()==iNazwaProcesu.LowerCase())
                {
                        process_count++;
                }
                processInfo->dwSize = sizeof(PROCESSENTRY32);
                Process32NextRetVal = Process32Next(hSnapShot, processInfo);
        }
        CloseHandle(hSnapShot);
        SAFE_DELETE(processInfo);
        return (process_count < 2);
}


Jak ktoś przeanalizuje fakt to stwierdzi że zmiana nazwy execa pozwoli oszukać tę funkcję.

2 komentarze

eiddon 2006-09-08 21:40

O wiele krócej i zgrabniej można zrobić to samo za pomocą tzw. mutexów. Ponieżej mała funkcyjka sprawdzający czy program jest już uruchomiony:

//---------------------------------------------------------------------------
bool RunTest()
{
CreateMutex(NULL, TRUE, "UNIQUE_NAME");
    if (GetLastError() == ERROR_ALREADY_EXISTS) return true;
    else return false;
}
//---------------------------------------------------------------------------

Zwraca true gdy program jest już uruchomiony lub false gdy jeszcze nie jest. Działa niezależnie od lokalizacji programu oraz jego nazwy.

Coldpeer 2006-09-06 16:38

Warto wspomnieć, że to kod pod C++Builder.