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

Langage Delphi Discussion :

ShellExecute et paramètre registre


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut ShellExecute et paramètre registre
    Bonjour à tous,

    Je suis devant un problème que j'essai de résoudre depuis plusieurs jours :
    Je veux lancer l'exécution d'un fichier registre *.reg avec la commande ShellExecute mais sans avoir la demande à l'utilisateur s'il accepte les modifications.

    Un peu partout sur le net je vois qu'il faut rajouter "/s" mais rien n'y fait j'ai tourné et retourné dans tout les sens possible ça ne fonctionne pas. En fait cela ne crée pas les clés registres.

    J'ai fait la même manip avec
    - un fichier bat, ça marche
    - un raccourcis sur le fichier reg, ça marche

    Voilà le code que j'ai utilisé pour lancer mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','regedit', ' /s C:\TEMP\monfichier.reg'), Nil, SW_SHOW);
    j'ai essayé aussi ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','regedit /s', 'C:\TEMP\monfichier.reg'), Nil, SW_SHOW);
    rien n'y fait j'ai même l'impression que les paramètres de type "/unelettre" ne fonctionnent pas (un test avec le "/C" ne marche pas non plus sur un autre code pour lancer une commande bat...)

    Je précise que je travaille avec Delphi 2010, Win XP Pro.

    Merci pour vos idées.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 149
    Points : 41 322
    Points
    41 322
    Billets dans le blog
    63
    Par défaut
    Tout d'abord ceci fonctionne très bien chez moi
    Citation Envoyé par D2010 WVista
    ShellExecute(0,nil,'patch.exe','/SILENT',nil,SW_HIDE);
    mais aussi sur les postes clients W XP
    donc
    j'ai même l'impression que les paramètres de type "/unelettre" ne fonctionnent pas
    c'est une fausse impression

    Plusieurs pistes de travail

    faire le open du fichier reg directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','C:\TEMP\monfichier.reg', '/s', Nil, SW_SHOW);
    bien spécifier un ShellExecuteW ?

    Utiliser CreateProcess a la place de shellexecute ? un exemple ici post 9

    voir si le '/s' n'est pas considéré comme une séquence d'échappement (j'y croit pas trop) en testant un '//s'

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    faire le open du fichier reg directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','C:\TEMP\monfichier.reg', '/s', Nil, SW_SHOW);
    J'ai testé, cela me met la boite de dialogue de confirmation.

    Citation Envoyé par SergioMaster Voir le message
    voir si le '/s' n'est pas considéré comme une séquence d'échappement (j'y croit pas trop) en testant un '//s'
    Pas ça non plus.

    Citation Envoyé par SergioMaster Voir le message
    Utiliser CreateProcess a la place de shellexecute ? un exemple ici post 9
    Ca me génère une exception sur EAccessViolation dans le module kernel32.dll en faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      StartupInfo: TStartupinfo;
      ProcessInfo: TProcessInformation;
    begin
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
    StartupInfo.cb := SizeOf(TStartupInfo);
    CreateProcess(nil, PChar('regedit /s C:\TEMP\monfichier.reg'), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, Startupinfo, ProcessInfo);
    end;
    Citation Envoyé par SergioMaster Voir le message
    bien spécifier un ShellExecuteW ?
    Ne fonctionne pas non plus avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecuteW(0,'OPEN','C:\TEMP\monfichier.reg', '/s', Nil, SW_SHOW);
    Par contre je rencontre un autre type d'erreur lié aux variables que je passe pour générer mon chemin.
    le chemin de mon fichier est construit de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'C:\TEMP\' + C_S_FicRegInstall + '-' + cCurLogon + '.reg'
    Les variables sont de type "string".
    J'ai donc pensé à typer toute la chaîne en PChar et cela me retourne la boite de dialogue de confirmation mais avec le chemin du fichier sous la forme d'une succession de carrés, comme ces caractère non pris en charge et forcément ça lui plait pas quand on lui répond oui.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 442
    Points
    13 442
    Par défaut
    Utilise reg import

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'reg', 'import c:\temp\monfichier.reg', nil, SW_HIDE);

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Ah bah c'est de pire en pire.
    J'ai voulut contourner l'utilisation du /s dans Delphi en créant un fichier bat avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regedit /s "C:\TEMP\monfichier.reg"
    et en lançant la commande delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','C:\TEMP\MAJRegistre.bat', Nil, Nil, SW_SHOWDEFAULT);
    Et ben ça marche pas non plus alors que si je lance manuellement le fichier bat créé, ça marche
    J'ai revérifié les chemins, les noms de fichiers, etc. Je suis bien administrateur de mon poste.

    J'ai pourtant l'éxécution d'un fichier bat (via ShellExecute) qui se fait bien dans une autre partie de mon code.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 442
    Points
    13 442
    Par défaut
    Un batch se lance par CMD /C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','cmd', '/C C:\TEMP\MAJRegistre.bat', Nil, SW_SHOWDEFAULT);

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Utilise reg import

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'reg', 'import c:\temp\monfichier.reg', nil, SW_HIDE);
    Marche pas non plus...

    Note : Je vous jure que ça marche pas , je ne vous fais pas tourner en bourrique !

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Un batch se lance par CMD /C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0,'OPEN','cmd', '/C C:\TEMP\MAJRegistre.bat', Nil, SW_SHOWDEFAULT);
    au passage tu as oublié un paramètre "nil"

    Ca m'étonne car j'ai le lancement d'un fichier bat dans une autre partie de mon programme qui se passe nickel et que je lance comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'OPEN', 'C:\TEMP\GetSID.bat', nil, nil, SW_SHOWDEFAULT);
    Mais j'ai quand même essayé et pareil, rien ne se passe dans ma base de registre...

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 442
    Points
    13 442
    Par défaut
    Citation Envoyé par Golork Voir le message
    au passage tu as oublié un paramètre "nil"
    Non, tout y est !

    J'ai testé toutes les variantes avec succès. Es-tu sûr de ne pas avoir une limitation au niveau de la clé elle-même ?

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Non, tout y est !
    J'avais mal vu que tu avait séparé "CMD" du reste.

    Citation Envoyé par Andnotor Voir le message
    J'ai testé toutes les variantes avec succès. Es-tu sûr de ne pas avoir une limitation au niveau de la clé elle-même ?
    Si j'avais une limitation je l'aurais aussi en exécutant le fichier bat directement via l'explorateur windows, non ?
    Or cela se passe sans problème, les clés sont parfaitement dans la BDR.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Au lieu de lancer le fichier .reg, pourquoi ne pas créer une fonction qui le lit et modifie directement la BR avec TRegistry.OpenKey ; en faisant de cette façon dans le cas où certaine des clés existent déjà, tu peux en plus les lire avant pour sauvegarder leurs valeurs au cas où...

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par istam3 Voir le message
    Au lieu de lancer le fichier .reg, pourquoi ne pas créer une fonction qui le lit et modifie directement la BR avec TRegistry.OpenKey ; en faisant de cette façon dans le cas où certaine des clés existent déjà, tu peux en plus les lire avant pour sauvegarder leurs valeurs au cas où...
    En fait l'installation de mon application est un peu compliqué et le PC d'installation est très restrictifs en termes de droits.

    Le lancement de mon application doit se faire en tant qu'administrateur et donc utilise le SID Administrateur pour l'installation dans la base de registre, c'est pourquoi quand je crée le fichier reg, j'y inclus le SID de l'utilisateur sur lequel l'installation doit se faire, chose qui me parait assez compliqué à faire avec un "TRegistry.xxx".

    Enfin bon vous billez pas, cela me semble pas possible pour l'heure et j'ai convaincu mon client de cliquez sur la boite de dialogue de confirmation pour valider l'installation.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    A priori il est toujours possible de lire et écrire sans restrictions (et donc pas de droits) dans HKEY_CURRENT_USER.

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par istam3 Voir le message
    A priori il est toujours possible de lire et écrire sans restrictions (et donc pas de droits) dans HKEY_CURRENT_USER.
    Je suis d'accord mais pour mon application je doit écrire dans HKEY_USERS !

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Si tu veux écrire dans la section de HKEY_USERS de l'utilisateur courant alors c'est la même chose que d'écrire dans HKEY_CURRENT_USER (qui n'est qu'une sous-section de HKEY_USERS), excepté que par sécurité le système t'empêches l'accès à HKEY_USERS pour ne pas modifier les infos des autres utilisateurs

  16. #16
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut
    bonjour,

    personnellement j'utilise ExecuteFile, au lieu de ShellExecute, fonction se trouvant dans Delphi / FmxUtils.pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function ExecuteFile(const FileName, Params, DefaultDir: string;
      ShowCmd: Integer): THandle;
    var
      zFileName, zParams, zDir: array[0..79] of Char;
    begin
      Result := ShellExecute(Application.MainForm.Handle, nil,
        StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
        StrPCopy(zDir, DefaultDir), ShowCmd);
    end;
    qui ne pose aucun probléme.

    PL

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    FmxUtils ???
    La vieille Démo File Manager "filmanex" de Delphi 6 et C++Builder 6 !
    Faudrait éviter d'utiliser ce préfixe FMX maintenant réservé à Fire Monkey !

    ton ExecuteFile n'est jusque l'encapsulation de ShellExecute !
    A noter que cela utilise nil au lieu de 'OPEN' comme commande, cela doit donc utiliser la commande par défaut du Shell !

    Il serait bien aussi de définir le chemin lpDirectory avec le chemin du Bat, cela peut changer le comportement

    @paulfr, ton réponse était bien de le cadre précis de l'import d'un Fichier Reg permettant son import dans la Base de Registre ?

    Faudrait moderniser la fonction, qui là gère une limite du DOS (80 caractères pour un chemin incluant (Disk : Dir FileName . Ext) qui est sous Windows poussé à MAX_PATH (260)
    Idem, le transtypage en PChar d'un String fonctionne parfaitement ... StrPCopy c'est intéressant mais pas très utile !

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/07/2008, 16h41
  2. paramètre base de registre
    Par lemapas dans le forum Windows XP
    Réponses: 1
    Dernier message: 17/06/2008, 16h40
  3. Modifier un paramètre IE via les registres
    Par jpberub dans le forum Windows
    Réponses: 0
    Dernier message: 02/08/2007, 17h28
  4. Clé de registre avec des paramètres
    Par wappyboy dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 18/07/2006, 17h10
  5. base de registre : paramtres de valeurs !
    Par hiko-seijuro dans le forum MFC
    Réponses: 2
    Dernier message: 25/09/2005, 13h56

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