Exécution unique

Signaler
Messages postés
4
Date d'inscription
jeudi 15 novembre 2007
Statut
Membre
Dernière intervention
5 septembre 2008
-
Messages postés
4
Date d'inscription
jeudi 15 novembre 2007
Statut
Membre
Dernière intervention
5 septembre 2008
-
Bonjour,

J'aimerais faire en sorte qu'un programme ne s'exécute qu'une seule fois sur un poste.
Comment est il possible concrètement de faire cela sans avoir recours à un fichier externe? ( en utilisant la base de registre par exemple je suppose) mais je ne sais pas comment m'y prendre... Existe-t-il un moyen Simple ?

Merci d'avance pour vos réponses.
Etant totalement néophyte en matière de programmation, j'accepte volontier les réponses Claires et précises.

(en langage C)

7 réponses

Messages postés
15108
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 juillet 2021
97
Hello,
Ce sujet a été traité sur le forum. Regarde par ici.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Sous Windows, tu peux utiliser un Mutex. Tu mets le petit code suivant au début de ton main ou WinMain:
HANDLE hMutex = CreateMutex(0, 0,"monmutex");
if ( GetLastError() == ERROR_ALREADY_EXISTS )
{
    MessageBox(0,"Programme déjà en exécution","Mon prog",0);
    if ( hMutex ) CloseHandle(hMutex);
    return FALSE;
}
Si ce code est exécuté par la première instance, ton programme se lance normalement. Pour une tentative de lancement d'une 2ème instance, le message d'erreur sera affiché et le programme quitté.
Messages postés
4
Date d'inscription
jeudi 15 novembre 2007
Statut
Membre
Dernière intervention
5 septembre 2008

Merci pour vos réponses, mais je crois que ce n'est pas tout à fait ce que je cherche...
Il me semble que vos solutions permettent d'éviter de lancer 2 X le même programme simultanément, or je cherche le moyen de ne permettre qu'une seulle éxécution sur un poste, simultanée ou non. C'est à dire, une fois que le programme a déjà été exécuté une fois, il ne peut plus s'exécuter même après fermetureet réouverture.
A moins que je n'ai pas biens saisi vos liens...
Messages postés
15108
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 juillet 2021
97
Ah ok...
Et bin, là, pas de mystère: si tu veux garder l'info de lancement même après fermeture de ton prog, il te faut la stocker de manière "permanente". Donc: fichier ou base de registre...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
4
Date d'inscription
jeudi 15 novembre 2007
Statut
Membre
Dernière intervention
5 septembre 2008

Merci bien,

C'est bien ce qui me semblait....
ce qui m'embete du fichier externe, c'est qu'il suffit de le copier avant exécution puis le remplacer au besoin pour qu'il n'ait plus d'utilité! Je vais essayer de bouiner quelque chose sur la BDR.
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
Pour écrire une clef dans BdR

void setTxt(HKEY HK, const char * cle, const char * nom, const char * valeur)
{
/// ----------------------------------------------------------------------------------------------------------------------
/// ---------------- BBaseRegistre::setTxt(HKEY HK ,const char* cle ,const char* nom ,const char* valeur) ----------------
/// ----------------------------------------------------------------------------------------------------------------------
/// -----  Objectif    : Ecrit une valeur de type chaine de caractère dans la base de registre
/// -----  PreCond    : /
/// -----  PostCond    : /
/// -----  Etat        : 1            (-1<0<1<2)
/// ----------------------------------------------------------------------------------------------------------------------
/// -----  HKEY HK    : clef principale de la base de registre (ex : HKEY_CLASSES_ROOT)
/// -----  const char* cle    : chemin d'accès à la valeur de la base de registre
/// -----  const char* nom    : nom de la valeur
/// -----  const char* valeur    : chaine de caractère
/// ----------------------------------------------------------------------------------------------------------------------
    SECURITY_ATTRIBUTES SecAtt;
    SecAtt.nLength=sizeof(SECURITY_ATTRIBUTES);
    SecAtt.lpSecurityDescriptor=NULL;
    SecAtt.bInheritHandle=TRUE;
    HKEY Retour;
    DWORD Action;
    RegCreateKeyEx(HK,cle,0,"", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, & SecAtt, &Retour, &Action);
    RegSetValueEx(Retour,nom,0,REG_EXPAND_SZ ,(unsigned char *)valeur,strlen(valeur)+1);
    RegCloseKey(Retour);
}

pour checker si une clef est bien définie avec la valeur que tu désires

bool getTxt(HKEY HK, const char * cle, const char * nom, std::string* valeur,unsigned long tailleMaxChaine)
{
/// ----------------------------------------------------------------------------------------------------------------------------------------------------------
/// ---------------- BBaseRegistre::getTxt(HKEY HK ,const char* cle ,const char* nom ,BString* valeur ,unsigned long tailleMaxChaine) -> bool ----------------
/// ----------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  Objectif    : lit la valeur alphanumérique "nom" dans la clé "cle" de la base de registre
/// -----  PreCond    : /
/// -----  PostCond    : /
/// -----  Etat        : 1            (-1<0<1<2)
/// -----  MaJ 12/05/04    : correction bug (à l'init, entrainant un plantage)
/// ----------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  HKEY HK    : clef principale de la base de registre (ex : HKEY_CLASSES_ROOT)
/// -----  const char* cle    : chemin d'accès à la valeur de la base de registre
/// -----  const char* nom    : nom de la clef
/// -----  string* valeur    : emplacement pour la réponse
/// -----  unsigned long tailleMaxChaine(par défaut : '100')    : taille du buffer // IMPERATIF sous win 95-98
/// ----------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  retour (bool)    : OK
/// ----------------------------------------------------------------------------------------------------------------------------------------------------------
    HKEY Retour;
    long rep=RegOpenKeyEx(HK,cle,0,KEY_ALL_ACCESS,&Retour);
    char*val;
    {
        unsigned long j;
        if ((val = ((char *)malloc((size_t)((tailleMaxChaine+1)*sizeof(char)))) )== NULL)
            return false;
        for(j=0;j<=tailleMaxChaine;j++)
            val[j]=0;
      }
    unsigned long type;
    long rep2=RegQueryValueEx( Retour,nom,NULL,&type,(unsigned char *)val,&tailleMaxChaine);
    RegCloseKey(Retour);
    *valeur=val;
if(val)    free(val);
    return(rep==ERROR_SUCCESS && rep2==ERROR_SUCCESS);
}

utilisation :
commence par le check
puis si tout ok, fait le set puis ton code.

___________________________________________________________
Magicalement
Nono
Messages postés
4
Date d'inscription
jeudi 15 novembre 2007
Statut
Membre
Dernière intervention
5 septembre 2008

Merci beaucoup Nono

C'est Pil Poil ce qu'il me fallait .