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

Delphi Discussion :

Ajouter un dossier au PATH système


Sujet :

Delphi

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut Ajouter un dossier au PATH système
    Bonjour,
    je souhaiterais faire un programme qui ajoute : C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin au path s'il y est pas déjà seulement et que ça reste après le redémarrage du système. Un truc en plus c'est que je voudrais qu'à la place de C: on mette la vraie lettre du lecteur de l'utilisateur courant.
    Merci
    Bien cordialement

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Ces infos sont stockées dans la base de registres ou accessibles en direct.

    Tu as des explications sur https://stackoverflow.com/questions/...637349#3637349

    La lecture des ces infos peut se faire par System.SysUtils.GetEnvironmentVariable ou directement depuis la base de registres.
    https://docwiki.embarcadero.com/Libr...onmentVariable

    L'écriture se fait apr SetEnvironmentVariable accessible depuis l'API Windows.

    Pour les modifications il faut potentiellement les droits d'administrateur, tu devras donc faire une élévation de privilèges dans ton programme. Ca a été évoqué sur le forum il y a quelques semaines.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    désolé mais comme c'est un endroit critique du système et que c'est un peu compliqué, pourrais-tu STP me donner un snippet complet (avec l'élévation de privilèges), je pense que ça pourrait servir à d'autres ? Merci

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    SetEnvironmentVariable change uniquement pour le process en cours et pour ses enfants crées par CreateProcess dont on fait hériter son contexte.


    Sinon modifier PATH, ça c'est une approche mais pourquoi ne pas plutôt expliquer le véritable problème et nous laisser proposer une solution alternative ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    je veux installer un programme de deeplearning qui nécessite un programme Python qui ne peut être installé sans être compilé, donc je dis à mes clients d'installer VS Community 2019, et les scripts Python qui doivent être compilés doivent trouver le chemin de cl.exe à plein d'endroits dans le code et d'autres binaires de VS Community 2019 donc je demande à ce que le chemin vers les binaires de VS Community 2019 soit ajouté au PATH. Mais comme c'est un peu compliqué pour les utilisateurs finaux et qu'ils risquent de faire des bêtises dans le PATH je voulais faire un exécutable simple qui une fois lancé fasse le job. Mais si ce n'est pas possible je vais leur faire un tuto pour le faire eux-mêmes.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Euh
    donc je dis à mes clients d'installer VS Community 2019
    Donc une utilisation commerciale d'une version Community ... c'est légal ça ?

    Il faudrait regarder un outil type InstallShield qui est conçu pour faire ce genre de package avec l'inclusion d'un téléchargement d'un MSI tiers.

    Et normalement, on ne fait pas installer VS mais uniquement les Redistribuable, il faut séparer ces deux ensemble.


    Et l'intégration de Python for Delphi, et tous les sujets actuels d'interopérabilité entre ces deux langages, vous devriez vous y intéresser.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    je dis "clients" mais c'est un projet bénévole, le programme sera gratuit et je peux pas dire à mes "clients" d'acheter VS 2019 pour utiliser mon logiciel ! oui mais là il faut obligatoirement compiler, je sais c'est bizarre masi pas le choix pour ce programme, donc les redistribuables ne suffisent pas

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    donc en gros ce n'est pas possible par un BATCH ou un EXE de modifier le PATH pour tous les programmes et même après redémarrage ?

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Biensur que si ShellExecute avec le vert RunAs et un manifest de requestedPrivileges requireAdministrator

    Personnalisation du fichier manifeste d'une application Windows
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    mais alors comment vu que SetEnvironmentVariable ne marche pas ?

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Avez vous au moins chercher un peu plus ?

    variables d'environnement windows ou SendMessage me semblait peu prudent, je pense que PostMessage sera moins problématique et la MSDN recommande comme je l'avais recommandé en 2012 la fonction SendMessageTimeout

    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
    function SetGlobalEnvironment(const Name, Value: string; const User: Boolean = True): Boolean;
    resourcestring
      REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
      REG_USER_LOCATION = 'Environment';
     
    begin
      with TRegistry.Create do
        try
          if User then { User Environment Variable }
            Result := OpenKey(REG_USER_LOCATION, True)
          else { System Environment Variable }
          begin
            RootKey := HKEY_LOCAL_MACHINE;
            Result := OpenKey(REG_MACHINE_LOCATION, True);
          end;
          if Result then
          begin
            WriteString(Name, Value); { Write Registry for Global Environment }
            { Update Current Process Environment Variable }
            SetEnvironmentVariable(PChar(Name), PChar(Value));
            { Send Message To All Top Window for Refresh }
            SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
          end;
        finally
          Free;
        end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    ok ça avance j'ai trouvé ici comment demander les privilèges d'administrateur : https://www.developpez.net/forums/d2.../#post11850715
    dernière question avant que je me lance dans le code : quelle est la différence entre
    User Environment Variable et System Environment Variable SVP ?

  13. #13
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Faudrait que vous preniez un peu de temps d'apprendre ... non

    System = all users
    User = current user

    C'est pourtant évident


    PS : votre lien montre ma réponse, vous avez loupé votre copier-coller ...


    Sinon pour quelqu'un qui propose des outils de DeepLearning, vos questions sur le forum sont quand d'un niveau très débutant, je vous souhaite bon courage.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    j'arrive au code suivant :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,registry,strutils;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    function SetGlobalEnvironment(const Name, Value: string; const User: Boolean = True): Boolean;
    resourcestring
      REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
      REG_USER_LOCATION = 'Environment';
     
    begin
      with TRegistry.Create do
        try
          if User then { User Environment Variable } //current user
            Result := OpenKey(REG_USER_LOCATION, True)
          else { System Environment Variable }     //all users
          begin
            RootKey := HKEY_LOCAL_MACHINE;
            Result := OpenKey(REG_MACHINE_LOCATION, True);
          end;
          if Result then
          begin
            WriteString(Name, Value); { Write Registry for Global Environment }
            { Update Current Process Environment Variable }
            SetEnvironmentVariable(PChar(Name), PChar(Value));
            { Send Message To All Top Window for Refresh }
            SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
          end;
        finally
          Free;
        end;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var path ,lecteur,chemin: string;
    l:tstringlist;
    present:boolean;
    i:integer;
    begin
    path:=GetEnvironmentVariable('PATH');
    if rightstr(path,1)=';' then
       path:=copy(path,1,length(path)-1);
    lecteur:= leftstr(GetEnvironmentVariable('PROGRAMFILES'),2);
    chemin:=lecteur+'\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin';
    try
      l:=tstringlist.Create;
      l.Delimiter:=';';
      l.StrictDelimiter := True;
      l.DelimitedText   := path;
      present:=false;
      for I := 0 to l.Count-1 do
        if l[i]=chemin then
        begin
          present:=true;
          break;
        end;
      if not present then
        path:=path+';'+chemin;
       SetGlobalEnvironment('PATH',path, false);
    finally
      l.Free;
    end;
     
    end;
     
    end.
    mais ça ne marche pas le programme bloque à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
    et le PATH reste inchangé

  15. #15
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    j'ai maintenant le code suivant mais il m'a pourri mon PATH avec plein de valeurs, apparemment il a pris le PATH de Delphi comme base de départ, par contre l'entrée est bien ajoutée


    dîtes-moi SVP ce que je dois changer pour prendre au départ le PATH du système et non le path de delphi, c'est la dernière étape

    merci


    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,registry,strutils;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    function SetGlobalEnvironment(const Name, Value: string; const User: Boolean = True): Boolean;
    resourcestring
      REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
      REG_USER_LOCATION = 'Environment';
     
    begin
      with TRegistry.Create do
        try
          if User then { User Environment Variable } //current user
            Result := OpenKey(REG_USER_LOCATION, True)
          else { System Environment Variable }     //all users
          begin
            RootKey := HKEY_LOCAL_MACHINE;
            Result := OpenKey(REG_MACHINE_LOCATION, True);
          end;
          if Result then
          begin
            WriteString(Name, Value); { Write Registry for Global Environment }
            { Update Current Process Environment Variable }
            SetEnvironmentVariable(PChar(Name), PChar(Value));
            { Send Message To All Top Window for Refresh }
            SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(PChar('Environment')),SMTO_NORMAL,4,nil);
          end;
        finally
          Free;
        end;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var path ,lecteur,chemin: string;
    l:tstringlist;
    present:boolean;
    i:integer;
    begin
    path:=GetEnvironmentVariable('PATH');
    if rightstr(path,1)=';' then
       path:=copy(path,1,length(path)-1);
    lecteur:= leftstr(GetEnvironmentVariable('PROGRAMFILES'),2);
    chemin:=lecteur+'\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;';
    try
      l:=tstringlist.Create;
      l.Delimiter:=';';
      l.StrictDelimiter := True;
      l.DelimitedText   := path;
      present:=false;
      for I := 0 to l.Count-1 do
        if l[i]=chemin then
        begin
          present:=true;
          break;
        end;
      if not present then
        path:=path+';'+chemin;
       SetGlobalEnvironment('PATH',path, true);
       showmessage('Path modifié avec succès !');
    finally
      l.Free;
    end;
     
    end;
     
    end.

  16. #16
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    j'ai finalement réussi avec le code suivant, le code pourrait être plus joli mais ça fonctionne :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,registry,strutils;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    function SetGlobalEnvironment(const Name, Value: string; const User: Boolean = True): Boolean;
    resourcestring
      REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
      REG_USER_LOCATION = 'Environment';
     
    begin
      with TRegistry.Create do
        try
          if User then { User Environment Variable } //current user
            Result := OpenKey(REG_USER_LOCATION, True)
          else { System Environment Variable }     //all users
          begin
            RootKey := HKEY_LOCAL_MACHINE;
            Result := OpenKey(REG_MACHINE_LOCATION, True);
          end;
          if Result then
          begin
            WriteString(Name, Value); { Write Registry for Global Environment }
            { Update Current Process Environment Variable }
            SetEnvironmentVariable(PChar(Name), PChar(Value));
            { Send Message To All Top Window for Refresh }
            SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(PChar('Environment')),SMTO_NORMAL,4,nil);
          end;
        finally
          Free;
        end;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var path ,lecteur,chemin: string;
    l:tstringlist;
    present:boolean;
    i:integer;
    resourcestring
      REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
      REG_USER_LOCATION = 'Environment';
    begin
      with TRegistry.Create do
        try
          if true then { User Environment Variable } //current user
            OpenKey(REG_USER_LOCATION, True)
          else { System Environment Variable }     //all users
          begin
            RootKey := HKEY_LOCAL_MACHINE;
            OpenKey(REG_MACHINE_LOCATION, True);
          end;
          path:=ReadString('PATH');
        finally
          Free;
        end;
     
    if rightstr(path,1)=';' then
       path:=copy(path,1,length(path)-1);
    lecteur:= leftstr(GetEnvironmentVariable('PROGRAMFILES'),2);
    chemin:=lecteur+'\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin';
    try
      l:=tstringlist.Create;
      l.Delimiter:=';';
      l.StrictDelimiter := True;
      l.DelimitedText   := path;
      present:=false;
      for I := 0 to l.Count-1 do
        if l[i]=chemin then
        begin
          present:=true;
          break;
        end;
      if not present then
        path:=path+';'+chemin;
       SetGlobalEnvironment('PATH',path+';', true);
       showmessage('Path modifié avec succès !');
    finally
      l.Free;
    end;
     
    end;
     
    end.

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

Discussions similaires

  1. [Batch] ajouter un dossier au PATH système
    Par Sylvain255 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 17/06/2022, 12h54
  2. Ajouter un dossier /mnt/xx/x/sur Apache
    Par MBAYE BABACAR GUEYE dans le forum Apache
    Réponses: 4
    Dernier message: 19/02/2013, 12h16
  3. Ajout variable d'environnement au PATH Système
    Par flashnet dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 12/02/2009, 17h13
  4. Ajout d'un zoom à un système de trackball
    Par f56bre dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 15/03/2007, 17h42
  5. Ajouter des variables au PATH
    Par Feustine dans le forum Langage
    Réponses: 5
    Dernier message: 16/08/2005, 13h59

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