Exécution unique

caillenne Messages postés 4 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 5 septembre 2008 - 2 sept. 2008 à 14:35
caillenne Messages postés 4 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 5 septembre 2008 - 5 sept. 2008 à 13:59
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

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
2 sept. 2008 à 15:41
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...
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 sept. 2008 à 21:43
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é.
0
caillenne Messages postés 4 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 5 septembre 2008
3 sept. 2008 à 11:18
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...
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
3 sept. 2008 à 11:32
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
caillenne Messages postés 4 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 5 septembre 2008
4 sept. 2008 à 08:53
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.
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
4 sept. 2008 à 09:07
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
0
caillenne Messages postés 4 Date d'inscription jeudi 15 novembre 2007 Statut Membre Dernière intervention 5 septembre 2008
5 sept. 2008 à 13:59
Merci beaucoup Nono

C'est Pil Poil ce qu'il me fallait .
0
Rejoignez-nous