Jak sprawdzić, czy program jest już uruchomiony

marsianinek

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 komentarzy

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.

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