IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

utlisation du registre, recherche des problèmes !


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut utlisation du registre, recherche des problèmes !
    Bonjour,

    j'aimerais faire fonctionner la fonction suivante qui s'applique dans le registre, lorsque j'execute mon code, cela ne marche pas devrais je travailler avec les droits d'admin ou d'autre idées, je vous avoue que je ne sais plus quoi faire... (j'ai essayer de démarrer mon .exe en mode admin sans succès..)

    je n'ai pas mis tout mon programme dites moi si vous voulez le reste.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    //démarage avec windows
     
    void addToStartup(const char *path = "C:/Users/Nicolas/Desktop/SmartDef/bin/Release/SmartDef.exe", const char *name = "SmartDef.exe", bool state = true)
     
    {
     
        HKEY key;
     
        if(state)
        {
            MessageBox(NULL, "lancement addtostartup", "SmartDef", MB_ICONINFORMATION);
     
     
     
            if( RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &key)!= ERROR_SUCCESS )
            {
                MessageBox(NULL, "impossible d'ouvrir la clef run", "SmartDef", MB_ICONINFORMATION);
            }
            else
            {
                if( RegSetValueEx(key, name, 0, REG_SZ, (BYTE*)path, strlen(path)+1)  != ERROR_SUCCESS )
                {
                    MessageBox(NULL, "impossible de définir une nouvelle valeur", "SmartDef", MB_ICONINFORMATION);
                }
                else
                {
                    RegCloseKey(key);
                }
            }
        }
        else
        {
            RegCloseKey(key);
            MessageBox(NULL, "echec addtostartup", "SmartDef", MB_ICONINFORMATION);
        }
     
        return;
     
    }

    Wetzzzzer

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Autant le dire tout de suite, la base de registre et moi, ca ne fait même pas deux, mais plutôt cinq ou dix... Je vais donc peut-être dire une grosse co..rie, mais, pour moi, seules les applications qui se trouvent dans certains dossier (Programmes ou Program Files (x86) par exemple) on le droit d'aller triturer la base de registre (sous réserve bien entendu d'être lancé en mode admin). Me tromperais-je

    En tout état de cause, je doute très fort que windows accepte qu'une application présente dans le dossier d'un utilisateur simple puisse y avoir accès, quelque soit la manière dont elle est lancée.

    Enfin, et ca, je suis sur de mon coup, j'aurais tendance à dire que ce n'est pas à ton application de s'enregistrer dans la base de registre, car, si elle le fait, elle va essayer de s'enregistrer à chaque fois quelle sera lancée, et , comme le but de l'enregistrement est, justement de la faire démarrer à chaque démarrage du pc, on va rapidement finir par tourner en bourrique

    Pour ma part, j'aurais tendance à te conseiller de tenter la création d'un installateur (il y en a de très faciles et des gratuits), qui produira l'enregistrement dans la base de registre en phase de "post installation"

    PS : au fait, pourquoi te faire ch...er à transmettre deux chaines de caractères (C style, en plus) à ta fonction, si c'est de toutes manières pour leur donner des valeurs par défaut qui correspondent... aux valeur constantes que tu voudras écrire dans la base de registre

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut utlisation registre recherche problemes
    Merci de ta réponse,

    J'ai suivis ton conseil concernant l'installeur et il est vrai que cela se révèle bien plus simple mais par contre, dans celui que j'ai pris (j'ai utilisé Inno Setup compiler), ils ne proposaient pas le démarrage avec Windows. (et je cherche également un installeur qui proposerait un redémarrage immédiat si tu en connais un je suis preneur )

    Enfin je pense facilement trouver ça sur internet. En revanche j'ai essayé d’exécuter mon programme depuis programme file en mode admin sans succès car j'ai une autre fonction qui utilise le registre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
     
    //les clefs usb ne peuvent pas faire office de clavier
    void ecritDef (bool stat = true,  const char *nom = "writeProtect")
     
    {
     
        HKEY key;
     
        if (stat)
        {
            MessageBox(NULL, "lancement ecritdef", "SmartDef", MB_ICONINFORMATION);
     
            if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\StorageDevicePolicies", 0, KEY_WRITE, &key) != ERROR_SUCCESS )
            {
     
                if( RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\StorageDevicePolicies"), 0, REG_OPTION_NON_VOLATILE, 0, KEY_ALL_ACCESS, 0, &key,NULL)!= ERROR_SUCCESS )
                {
                    MessageBox(NULL, "impossible de créer la celf StorageDevicePolicies", "SmartDef", MB_ICONINFORMATION);
                }
                else
                {
                    const int valeur = 1;
                    if( RegSetValueEx(key, TEXT(nom), 0, REG_DWORD, (LPBYTE)&valeur, (DWORD)sizeof(valeur)) != ERROR_SUCCESS )
                    {
                        MessageBox(NULL, "impossible de créer une valeur dans la clef StorageDevicePolicies", "SmartDef", MB_ICONINFORMATION);
     
                    }
                    else
                    {
                        RegCloseKey(key);
                    }
                }
            }
            else
            {
                RegCloseKey(key);
            }
     
        }
     
        else
        {
            RegCloseKey(key);
            MessageBox(NULL, "echec écritdef", "SmartDef", MB_ICONINFORMATION);
        }
     
     
        return;
    }
    (l'objectif et d’empêcher les périphérique USB de faire office de clavier)
    Si tu as d'autres idées ou alternatives je suis preneur encore merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu n'as pas besoin d'être admin pour enregistrer un programme dans HKCU\...\Run afin qu'il se lance quand l'utilisateur en question ouvre une session.
    Ton problème vient d'ailleurs: Tu passes une chaîne de char) RegSetValueEx() au lieu d'une chaîne de TCHAR (et au passage, ton cast devrait être en const BYTE *).

    Tu as besoin d'être admin pour toucher à quoi que ce soit dans HKLM.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 327
    Points
    12 327
    Par défaut
    Citation Envoyé par wetzzer Voir le message
    (l'objectif et d’empêcher les périphérique USB de faire office de clavier)
    Si tu as d'autres idées ou alternatives je suis preneur encore merci
    Votre "vrai" besoin, c'est de faire un Service Windows, et de l'enregistrer pour un démarrage automatique.
    (Une méthode encore plus bourrin, c'est de faire un driver de clavier générique qui intercepte le montage du périphérique).

    Et pitié, utilisez un Wrapper C++ à l'API C de Win32 :
    https://msdn.microsoft.com/en-us/mag...or=-2147217396
    Cela réglera "automatiquement" le problème de cast signalé par @Médinoc.

    Citation Envoyé par Médinoc
    Tu as besoin d'être admin pour toucher à quoi que ce soit dans HKLM.
    L'arborescence de la base de registre et d'un système de fichier fonctionne de la même manière, avec des ACL.
    https://powertoe.wordpress.com/2010/...th-powershell/

    Mais en utilisant les API d'enregistrement de Service Windows, on s'en fout de la base de registre. C'est aux primitives de l'OS de se démerder avec ces arcanes.

    Les Installateurs comme Wix (et peut-être InnoSetup) se charge de faire automatiquement le travail d'enregistrement du Service Windows.
    C'est la même chose avec les drivers, si vous cherchez à tester la méthode bourrin (en un peu plus compliquer quand même), à moins que les fichiers "inf" suffisent (je suis pas sûr).

    Citation Envoyé par koala01
    pour moi, seules les applications qui se trouvent dans certains dossier (Programmes ou Program Files (x86) par exemple) on le droit d'aller triturer la base de registre (sous réserve bien entendu d'être lancé en mode admin). Me tromperais-je
    Les ACL qui se basent sur les chemins sont assez rares. J'ai vu des démonstrations de leur application mais je ne les ai jamais vu directement utilisés par M$ et elles étaient aussi toujours adossées à l'utilisation de manifeste d'application signés par des tiers de confiances dûment configurés.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci de vos réponse,

    j'avais en effet un problème de conversion, j'ai donc utilisé const TCHAR mais par contre const BYTE ne fonctionnait pas.
    j'ai d'ailleurs du mal à voir la différence entre BYTE et char, pour moi, ils gèrent la même quantité d'information mais je pense qu'il manque quelque chose à mon raisonnement...

    concernant le Wrapper, si j'ai bien compris, il faut que je retourne la valeur DWORD...

    Et enfin pour les services Windows c'est une excellente idée, je pense diviser mon programme et faire l'installeur qui activerais mes services lors de l'installation.

    Merci encore de votre aide

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    BYTE est probablement un unsigned char, dont la plage de valeur définie par le standard (0..255) n'est pas celle de signed char (-128..127), et n'est pas spécifiquement celle de char (0..127).
    Cela dit, la seule chose qui compte, c'est que c'est BYTE le bon type, quel qu'il soit.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    TCHAR ce n'est pas char.
    TCHAR c'est plus souvent wchar_t.
    BYTE vaut unsigned char dans 99% des cas. Parfois char mais ça reste kifkif puisqu'on l'utilise généralement juste pour avoir 8 bits et comme bitfield ou donnée brute abstraite.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    je saisis pour la différence mais qu'est ce qui vous permet d'être sûr qu'ici c'est BYTE?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 327
    Points
    12 327
    Par défaut
    je saisis pour la différence mais qu'est ce qui vous permet d'être sûr qu'ici c'est BYTE?
    Utilisez le Wrapper !!!

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    ok ok

    merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de recherche des enregistrements
    Par diablo-dz dans le forum Bases de données
    Réponses: 19
    Dernier message: 15/05/2014, 17h51
  2. Problème de recherche des éléments dans une liste.
    Par amine1980 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 09/04/2011, 23h34
  3. Réponses: 2
    Dernier message: 16/10/2008, 10h49
  4. [XPath] Problème pour rechercher des caractères spéciaux
    Par JolyLoic dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 13/12/2006, 13h41
  5. Problème "Rechercher des patrons" avec Korn Shell
    Par dongnold dans le forum Linux
    Réponses: 2
    Dernier message: 29/07/2006, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo