Met gebruik van 2 unieke mutexen kan dit lukken.
In het update programma maak je een unieke mutex aan (mutex1), vervolgens voer je het client programma uit. Het eerste wat je client programma doet is ook een unieke mutex maken (mutex2) en controleren of mutex2 al bestaat. Bestaat mutex2 dan weet je dat er al een client programma draaiende is en sluit je dit tweede client programma af (dit wordt algemeen gebruikt om te voorkomen dat een programma meer dan 1 maal op het zelfde systeem draait).
Als mutex2 niet bestaat controleer je of mutex1 bestaat (aangemaakt door het update programma). Bestaat mutex1 niet dan sluit je het client programma af (in dit geval is het client programma dus door een ander programma dan het update programma uitgevoerd). Bestaat mutex1 wel dan sluit je mutex1.
Het is heel belangrijk dat mutex1 wordt gesloten als het client programma is uitgevoerd.
Nou weet ik niet of het update programma moet draaien terwijl het client programma draait. Zo niet, dan sluit je het update programma simpelweg af nadat deze het client programma heeft opgestart en je bent klaar. Zo wel, dan kan dit op een aantal manieren.
Een manier is om een korte periode te wachten wanneer het update programma het client programma heeft uitgevoerd en vervolgens controleren of mutex2 al is aangemaakt, zo wel dan kun je nu mutex1 sluiten, zo niet dan wacht je nogmaals en controleer je opnieuw (lus).
Een betere manier is om het update programma te laten weten via het client programma dat het mutex1 moet sluiten. Dit kan ook weer op een aantal manieren.
Een andere manier is om mutex1 te sluiten door de CreateRemoteThread functie te gebruiken in het client programma om zo de CloseHandle functie uit te voeren vanuit het update programma.
Code voorbeeld van CreateMutex die je in ieder geval nodig zult hebben.
Code:
HANLDE hMutex2 = CreateMutex( NULL, FALSE, "mutex2" );
if ( hMutex2 != NULL )
{
if ( GetLastError() != ERROR_ALREADY_EXISTS )
{