2010-12-08 19 views
5

Estoy escribiendo una aplicación GUI de Windows que intenta invocar el script ANT de Apache. El script ANT creará y empaquetará un grupo de proyectos Delphi en un setup.exe final. El script ANT crea Delphi 2007/2010 y la aplicación Delphi XE.Un proceso iniciado por Delphi IDE "Ejecutar sin depuración" hereda las variables de entorno de IDE

Mi aplicación ANT GUI está compilada y construida por Delphi XE. Cuando uso "Ejecutar sin depurar" en Delphi XE para ejecutar la aplicación, la aplicación no funciona correctamente con el script ANT. El script ANT no crea la aplicación donde las DCU, BPL y EXE no se compilan en la carpeta que esperaba.

Sin embargo, si ejecuto mi aplicación GUI en el Explorador de Windows, el script ANT crea la aplicación correctamente> Todas las DCU, BPL y EXE se crearon y guardan en la carpeta que asigné.

Después de depurar la aplicación de la GUI, encontré que la aplicación ejecutada con Delphi "Ejecutar sin depurar" heredará variables de entorno de Delphi IDE. Aquí es cómo puedo extraer las variables de entorno:

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; 

Ésta es una lista de variables de entorno para un proceso iniciado por Delphi XE "Ejecutar sin depurar":

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 

Y esta es una lista de medio ambiente variables de un proceso puesto en marcha por el Explorador de Windows:

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 

comparación 2 lista de variables de entorno, es posible que observe que hay pocas variables como BDSINCLUDE y BDSBIN doesn' Existen en el proceso iniciado por Windows Shell. Esas variables de entorno del IDE de Delphi XE han afectado al script ANT que crea la aplicación Delphi 2007/2010. Mi problema debería solucionarse si esas variables de entorno IDE de Delphi no se muestran en el proceso.

¿Alguien tiene ideas si es posible iniciar el proceso (Ejecutar con o sin depuración) de Delphi IDE que no hereda las variables de entorno de Delphi IDE?

Respuesta

6

Gracias por las sugerencias de Rob Kennedy. Traté de usar SetEnvironmentVariable para nil variable uno por uno. Una de las variables de entorno Platform = Win32 impuestas por Delphi IDE causó el problema.

SetEnvironmentVariable('Platform', nil); 

Al configurar la plataforma para nada, la creación ANT funciona como se esperaba.

+0

Plataforma, esa es una nueva en Rad XE, creo. –

9

Un programa hereda el entorno del proceso que lo inicia. No hay ninguna razón para que Delphi limpie el ambiente de todos modos; los programas deben estar preparados para cualquier entorno arbitrario con el que comiencen.

Si su programa falla cuando se configuran ciertas variables de entorno, entonces necesita hacer que su programa lo solucione. Puede eliminar entradas del entorno de su programa con SetEnvironmentVariable; pasar un puntero nulo como el segundo parámetro. O puede averiguar por qué su programa es tan sensible a variables aparentemente no relacionadas y cambiarlo.

También puede generar un nuevo entorno y usarlo cuando su programa inicia Ant. Pase como el séptimo parámetro a CreateProcess. Establezca o elimine los valores que desee.

Cuestiones relacionadas