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 :

variables d'environnement windows


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut variables d'environnement windows
    Bonjour à tous,

    j'utilise Delphi 2010 et j'ai besoin de créer des variables windows afin qu'elles puissent être utilisées par une autre application qui est écrite en java.

    J'utilise la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if SetEnvironmentVariable(PChar('mavariable'), PChar('mavaleur'))
         then Result := 0
         else Result := GetLastError;
    A priori la variable se créée bien puisque je peux la rappeler avec la fonction dont le code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function GetEnvVarValue(const VarName: string): string;
    var
      BufSize: Integer;  // buffer size required for value
    begin
    BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
    if (BufSize > 0) 
    then begin
           SetLength(Result, BufSize - 1);
           GetEnvironmentVariable(PChar(VarName),
           PChar(Result), BufSize);
           end
           else Result := '';
    end;

    Par contre ces variables ne sont pas accessibles à d'autres applications. Il semblent que les variables créées avec cette fonction appartiennent au process de l'application Delphi mais pas pour les autres applications.

    Comment puis je faire pour créer et supprimer des variables windows accessibles par n'importe quelle autre application ?

    Merci d'avaance pour vos réponses,
    Wilco

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    On avait eu une question récemment la dessus : Dll et environnement windows

    SetEnvironmentVariable MSDN : "Sets the contents of the specified environment variable for the current process."

    Une DLL devrait partager la variable mais pas un autre process !

    Si tu lances un autre process par CreateProcess, ils partagent normalement les même vars

    A part Propriété Systèmes, je ne connais pas d'autres moyens "propres" pour modifier une var !
    Même Delphi ne le fait pas, on personnalise ses propres vars locales

    Les installateurs modifient le PATH mais le font-ils avec une API ou avec une méthode brutale comme modifier la BDR !
    Code reg : Sélectionner tout - Visualiser dans une fenêtre à part
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

    Sur mon poste, j'ai aussi ControlSet001 et ControlSet003

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci pour ce début de réponse...

    J'avance en utilisant un autre code trouvé sur le net (voir ci-après)

    J'ai juste un problème lorsque cette fonction envoie le message de Broadcast aux autres applications,

    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));

    Le programme ne répond plus. Y a t il une astuce ?




    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
    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';
    var
       regvar: TRegistry;
    begin
    regvar := TRegistry.Create;
    with regvar
    do try
       if User { User Environment Variable }
          then Result := OpenKey(REG_USER_LOCATION, True)
       else begin
            RootKey := HKEY_LOCAL_MACHINE;
            Result  := OpenKey(REG_MACHINE_LOCATION, True);
            end;
     
       if Result
       then begin
            WriteString(Name, Value); { Write Registry for Global Environment }
            SetEnvironmentVariable(PChar(Name), PChar(Value));
            { Send Message To All Top Window for Refresh }
     
            SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
          end;
       finally
       regvar.CloseKey;
       regvar.Free;
       end;
    end;
    Avec ce code, les variables sont stockées dans la base de registre et sont bien récupérées par la fonction Windows GetEnvironmentStrings.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    HWND_BROADCAST, je n'avais jamais essayé, j'espère que Windows le renvoi aussi à l'envoyeur (a mon avis, non ! )

    Pense que SendMessage est bloquant, il attend que tout les récepteurs récupérent le message
    Par prudence utilise SendMessageTimeout

Discussions similaires

  1. récupération de variable d'environnement windows avec javascript
    Par dorian2031 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/11/2006, 11h37
  2. [Système] Variable d'environnement Windows
    Par jdiamsss dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2006, 17h47
  3. [PHP-JS] Variable d'environnement Windows username
    Par licorne dans le forum Langage
    Réponses: 4
    Dernier message: 28/09/2006, 14h52
  4. variable d'environnement windows non interprétée
    Par rogerio dans le forum Windows
    Réponses: 4
    Dernier message: 02/06/2006, 07h06

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