Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Exécution unique [ Divers / Débutant(e) ] (caillenne)

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

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

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

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.