begin process at 2012 02 12 10:39:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

Exécution unique


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Exécution unique

mardi 2 septembre 2008 à 14:35:19 | Exécution unique

caillenne

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)
mardi 2 septembre 2008 à 15:41:16 | Re : Exécution unique

buno

Administrateur CodeS-SourceS
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...
mardi 2 septembre 2008 à 21:43:06 | Re : Exécution unique

racpp

Administrateur CodeS-SourceS
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é.

mercredi 3 septembre 2008 à 11:18:47 | Re : Exécution unique

caillenne

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...
mercredi 3 septembre 2008 à 11:32:27 | Re : Exécution unique

buno

Administrateur CodeS-SourceS
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...
jeudi 4 septembre 2008 à 08:53:41 | Re : Exécution unique

caillenne

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.
jeudi 4 septembre 2008 à 09:07:27 | Re : Exécution unique

magic_Nono

Membre Club
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
vendredi 5 septembre 2008 à 13:59:17 | Re : Exécution unique

caillenne

Merci beaucoup Nono

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


Cette discussion est classée dans : exécution, unique, réponses


Répondre à ce message

Sujets en rapport avec ce message

Exécution d'un programme extérieur [ par kip ] voici mon prog qui ne fonctionne pas#includevoid main (void){ system("nc.exe");}Le but de ce programme est de lancer une application extérieuraide Client/Serveur UDP sur 1 unique machine ! [ par sena ] Bonjour,j'ai fais deux programmes :un client et un serveur UDP.Ceux ci fonctionnent bien quand je les fait communiquer sur 2 machines différentes.Ce q Est-ce possible de créer une variable en cours d'exécution? [ par Hiperion ] j'aimerais savoir si c'est possible de créer une variable que l'utilisateur va me donner le nom durant que le programme va fonctionner, si oui, donner Convivialité des forums du rezo... [ par MoDDiB ] Il ne serait pas plus judicieux que la barre de nav de droite qui regoupe tous les new message de forum ne contiennent pas les réponses? car vu le nom erreur d'exécution VC++ 6.0 [ par Zaz16 ] Je développe un programme en VC++ 6.0, je souhaiterais debuguer, mais une erreur d'execution de bscmake.exe m'en empèche. Il me dit qu'il ne trouve pa BIG Problème d'exécution [ par nemmezis ] Salut tout le monde !J'ai un big problème dont je n'arrive pas à trouver la solution !J'ai crée une petite application avec DirectGraphics;Je n'ai auc instance unique d'une application [ par gadafla ] J'aimerais qu'en ouvrant autant de documents que je veux, ils aillent tous s'ouvrir sur une seule instance de mon programme, qui lui est multi-fenetre Identifier une machine [ par LuckyNut ] Salut,Quelqu'un peut-il me dire comment on peut identifier une machine de façon unique ?Ex je voudrais qu'un prog me renvoie un nombre ou une cle qui Erreur d'exécution après chargement dll [ par Cako19 ] Bonjour,Après avoir défini une fonction appartenant à une dll externe à mon projet, à l'aide de typedef, LoadLibrary, GetProcAdress et etc..., à l'exé opérations matrice /temps exécution prg [ par 0wil0 ] Bonjour, J'effectue dans mon programme des opérations relativement simples sur des matrices (additions, soustractions, moyenne des éléments de matrice


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,295 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales