2010-12-08 18 views
5

J'écris une application Windows GUI qui tente d'invoquer le script Apache ANT. Le script ANT va construire et emballer un groupe de projet Delphi dans un setup.exe final. Le script ANT construit l'application Delphi 2007/2010 et Delphi XE.Un processus lancé par Delphi IDE "Exécuter sans débogage" hérite des variables d'environnement de l'IDE

Mon application GUI ANT est compilée et construite par Delphi XE. Lorsque j'utilise "Exécuter sans débogage" dans Delphi XE pour exécuter l'application, l'application ne fonctionne pas correctement avec le script ANT. Le script ANT ne construit pas l'application où les DCU, BPL et EXE ne sont pas compilés dans le dossier que je m'attendais.

Cependant, si je lance mon application GUI dans Windows Explorer, le script ANT construit l'application correctement> Toutes les DCU, BPL et EXE ont été construites et conservées dans le dossier que j'ai assigné. Après le débogage de l'application graphique, j'ai trouvé que l'application exécutée avec "Exécuter sans débogage" de Delphi hériterait des variables d'environnement de Delphi IDE. Voici comment j'extraire les variables d'environnement:

function GetAllEnvVars(const Vars: TStrings): Integer; 
var 
    PEnvVars: PChar; // pointer to start of environment block 
    PEnvEntry: PChar; // pointer to an env string in block 
begin 
    // Clear the list 
    if Assigned(Vars) then 
    Vars.Clear; 
    // Get reference to environment block for this process 
    PEnvVars := GetEnvironmentStrings; 
    if PEnvVars <> nil then 
    begin 
    // We have a block: extract strings from it 
    // Env strings are #0 separated and list ends with #0#0 
    PEnvEntry := PEnvVars; 
    try 
     while PEnvEntry^ <> #0 do 
     begin 
     if Assigned(Vars) then 
      Vars.Add(PEnvEntry); 
     Inc(PEnvEntry, StrLen(PEnvEntry) + 1); 
     end; 
     // Calculate length of block 
     Result := (PEnvEntry - PEnvVars) + 1; 
    finally 
     // Dispose of the memory block 
     Windows.FreeEnvironmentStrings(PEnvVars); 
    end; 
    end 
    else 
    // No block => zero length 
    Result := 0; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    GetAllEnvVars(Memo1.Lines); 
end; 

Ceci est une liste des variables d'environnement pour un processus lancé par « Exécuter sans débogage » de Delphi XE:

ActiveHostApplication= 
ActiveProjectModule= 
ALLUSERSPROFILE=C:\ProgramData 
ANT_HOME=C:\Components\Components.d11\build.tool\apache-ant-1.7.1 
ANT_OPTS=-Xmx512m 
APPDATA=C:\Users\coder\AppData\Roaming 
AQtime7_Product_Path=C:\Program Files (x86)\Automated QA\AQtime 7\Bin\ 
BDS=c:\program files (x86)\embarcadero\rad studio\8.0 
BDSAppDataBaseDir=BDS 
BDSBIN=c:\program files (x86)\embarcadero\rad studio\8.0\bin 
BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\8.0 
BDSINCLUDE=c:\program files (x86)\embarcadero\rad studio\8.0\include 
BDSLIB=c:\program files (x86)\embarcadero\rad studio\8.0\lib 
BDSPROJECTSDIR=C:\Users\coder\Documents\RAD Studio\Projects 
BDSUSERDIR=C:\Users\coder\Documents\RAD Studio\8.0 
CG_BOOST_ROOT=C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\include\boost_1_39 
CommonProgramFiles=C:\Program Files (x86)\Common Files 
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files 
CommonProgramW6432=C:\Program Files\Common Files 
COMPUTERNAME=OBSERVER 
ComSpec=C:\Windows\system32\cmd.exe 
DELPHI=c:\program files (x86)\embarcadero\rad studio\8.0 

Et ceci est une liste de l'environnement variables pour un processus lancé par Windows Explorer:

ALLUSERSPROFILE=C:\ProgramData 
ANT_HOME=C:\Components\Components.d11\build.tool\apache-ant-1.7.1 
ANT_OPTS=-Xmx512m 
APPDATA=C:\Users\coder\AppData\Roaming 
BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\5.0 
CG_BOOST_ROOT=C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\include\boost_1_39 
CommonProgramFiles=C:\Program Files (x86)\Common Files 
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files 
CommonProgramW6432=C:\Program Files\Common Files 
COMPUTERNAME=OBSERVER 
ComSpec=C:\Windows\system32\cmd.exe 
FP_NO_HOST_CHECK=NO 

Comparer 2 liste des variables d'environnement, vous remarquerez peut-être il y a quelques variables comme BDSINCLUDE et BDSBIN n » T existe dans le processus lancé par Windows Shell. Ces variables d'environnement de l'EDI de Delphi XE ont affecté le script ANT qui construit l'application Delphi 2007/2010. Mon problème devrait résoudre si ces variables d'environnement IDE Delphi ne sont pas montrées dans le processus.

Est-ce que quelqu'un a des idées s'il est possible de lancer un processus (Exécuter avec ou sans débogage) à partir de Delphi IDE qui n'hérite pas des variables d'environnement de Delphi IDE?

Répondre

6

Merci pour les conseils de Rob Kennedy. J'ai essayé d'utiliser SetEnvironmentVariable à zéro variable un par un. Une variable d'environnement Platform = Win32 imposée par Delphi IDE a provoqué le problème.

SetEnvironmentVariable('Platform', nil); 

La définition de la plate-forme à zéro fait que la génération ANT fonctionne comme prévu.

+0

Plate-forme, c'est un nouveau dans Rad XE je pense. –

9

Un programme hérite de l'environnement du processus qui le démarre. Delphi n'a aucune raison de nettoyer l'environnement de toute façon; les programmes devraient être préparés pour tous les environnements arbitraires avec lesquels ils ont commencé.

Si votre programme échoue lorsque certaines variables d'environnement sont définies, alors vous devez faire en sorte que votre programme l'adresse. Vous pouvez supprimer des entrées de l'environnement de votre programme avec SetEnvironmentVariable; passez un pointeur nul en tant que deuxième paramètre. Ou vous pouvez comprendre pourquoi votre programme est si sensible à des variables apparemment sans rapport et le changer.

Vous pouvez également générer un nouvel environnement et l'utiliser lorsque votre programme démarre Ant. Passez-le en tant que septième paramètre à CreateProcess. Définir ou supprimer les valeurs souhaitées