Probleme shellexecute d'un .bat

Spellbound74 Messages postés 6 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 31 mars 2006 - 28 mars 2006 à 16:29
Spellbound74 Messages postés 6 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 31 mars 2006 - 28 mars 2006 à 18:25
Bonjour,

j'utilise shellexecute pour lancer un .bat

if ShellExecute(0,'OPEN',PChar('C:\...\RESTRICT.bat'), Nil, Nil, SW_SHOWNA)<=32 then ShowMessage(SysErrorMessage(GetLastError));

mais j'aurais besoin dans la fenetre DOS ouverte par shellexecute d'avoir acces à une variable d'environnement.

le fichier .bat lancé à la main reconnait ma variable, mais dans mon cas la variable est vide !
comment puis-je activer l'héritage des variables systemes definies sous windows ?

4 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
28 mars 2006 à 17:31
qu'elle variables d'environnement souhaite tu recuperer ?

une astuce pour toi :

toute les variables d'environnement sont contenue dans le registre, dans cette clef :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

il te suffirat alors de faire :

uses registry;

type
TEnvVars = (evComspec, evNumCPU, evOS, evPath, evPathext, evProcArch, evProcID,
evProcLevel, evProcRev, evTemp, evTMP, evWindir);

function GetEnvironnementVar(const EVVAR : TEnvVars) : string;
var REG : TRegistry;
begin
result := '';
REG := TRegistry.create;
REG.RootKey := HKEY_LOCAL_MACHINE;
if REG.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',false) then begin
case EVVAR of
evComspec : result := REG.ReadString('ComSpec');
evNumCPU : result := REG.ReadString('NUMBER_OF_PROCESSORS');
evOS : result := REG.ReadString('OS');
evPath : result := REG.ReadString('Path');
evPathext : result := REG.ReadString('PATHEXT');
evProcArch : result := REG.ReadString('PROCESSOR_ARCHITECTURE');
evProcID : result := REG.ReadString('PROCESSOR_IDENTIFIER');
evProcLevel : result := REG.ReadString('PROCESSOR_LEVEL');
evProcRev : result := REG.ReadString('PROCESSOR_REVISION');
evTemp : result := REG.ReadString('TEMP');
evTMP : result := REG.ReadString('TMP');
evWindir : result := REG.ReadString('windir');
end;
REG.CloseKey;
end;
REG.Free;
end;

voila. n'oublis pas que la plupart du temps, tout ce trouve dans le registre.

<hr size="2" width="100%">
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 mars 2006 à 18:07
Salut,
mais il n'est pas utile d'utiliser la base de registre pour cela, il existe aussi une fonction de l'unité Windows : ExpandEnvironmentStrings

Function ExpandEnvStrings(DirStr: String): String;
Var EnvVariable : Array[0..512] Of Char;
Begin
Result := EmptyStr;
ExpandEnvironmentStrings(PChar(DirStr), @EnvVariable, 512);
Result := EnvVariable;
End ;

Utilisation :

Label1.Caption : = ExpandEnvStrings('%WinDir%');
Label1.Caption := ExpandEnvStrings('%ProgramFiles%\Mon Dossier'); // Donne 'C:\Program Files\Mon Dossier' (Si tout est d'origine bien sur)

et voici la liste des variables disponibles à mettre toujours entre deux "%":
APPDATA
TEMP , TMP
COMPUTERNAME
CommonProgramFiles
COMSPEC
NUMBER_OF_PROCESSORS
OS
PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_REVISION
PROGRAMFILES
SYSTEMDRIVE
SYSTEMROOT
AllUsersProfile
USERPROFILE
WINDIR
The remainder are only available to interactive applications.


HOMEDRIVE
HOMEPATH
LOGONSERVER
USERDOMAIN
USERNAME
Only the WINDIR variable is available on Microsoft Windows® 95 and Windows 98 systems.

Et pour l'opération Inverse il faut déclarer dans la section Interface la fonction suivante:

function PathUnExpandEnvStrings(pszPath : PAnsiChar; pszBuf : PAnsiChar; cchBuf : Integer):Boolean; StdCall
external 'ShlwApi.dll' name 'PathUnExpandEnvStringsA';

Implementation

Function UnExpandEnvStrings(aPath : String): String;
Var eVariable : array[0..512] of Char;
begin
PathUnExpandEnvStrings(PChar(aPath), @eVariable, 512);
Result : = eVariable;
end;

Utilisation :

Label2.Caption := UnExpandEnvStrings('C:\Program Files\Mon Dossier'); // Donne '%ProgramFiles%\Mon Dossier'

@+
Cirec
0
Spellbound74 Messages postés 6 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 31 mars 2006
28 mars 2006 à 18:13
oui je connaissait l'emplacement des variables, d'ailleurs la variable a laquelle j'essaie d'acceder est une variable que j'ai créé moi-meme, avec la fonction SetSystemEnvVar.
j'utilise %nomdelavariable% dans mon batch, chose qui marche tres bien quand je le lance a la main, mais pas avec la fonction ShellExecute.

j'ai fait un SET au debut du batch pour voir quelles variables etaient présentes, et il n'y en a que 3 ! il s'agit de COMTEXT, PATHEXT et PROMPT
0
Spellbound74 Messages postés 6 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 31 mars 2006
28 mars 2006 à 18:25
en fait je semble avoir contourné le probleme, peut etre un bug de lazarus : quand ca arrive (seulement 3 variables d'env reconnues) il faut fermer lazarus, le reouvrir et a la premiere execution toutes les variables sont bien la!

maintenant quand je change interactivement la valeur de la variable d'env, le changement n'est pas propagé immediatement au reste du programme. a chaque fois , le shellexecute garde la premiere valeur, celle avec laquelle le programme s'est chargé
0
Rejoignez-nous