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ę.
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.