2010-12-08 6 views
5

Ich schreibe eine Windows GUI-Anwendung, die versucht, Apache ANT-Skript aufzurufen. Das ANT-Skript erstellt und packt eine Delphi-Projektgruppe in eine endgültige setup.exe. Das ANT-Skript erstellt Delphi 2007/2010 und Delphi XE-Anwendung.Ein von Delphi IDE gestarteter Prozess "Ausführen ohne Debugging" erbt Umgebungsvariablen von IDE

Meine ANT-GUI-Anwendung wird von Delphi XE kompiliert und erstellt. Wenn ich in Delphi XE "Ausführen ohne Debuggen" verwende, um die Anwendung auszuführen, funktioniert die Anwendung nicht korrekt mit ANT-Skript. Das ANT-Skript erstellt keine Anwendung, bei der die DCUs, BPLs und EXEs nicht in den von mir erwarteten Ordner übersetzt werden.

Wenn ich jedoch meine GUI-Anwendung in Windows Explorer starte, erstellt das ANT-Skript die Anwendung korrekt> Alle DCUs, BPLs und EXEs wurden erstellt und in dem Ordner behalten, den ich zugewiesen habe.

Nach dem Debuggen der GUI-Anwendung, fand ich, dass die Anwendung mit Delphi ausführen "Ohne Debugging ausführen" wird Umgebungsvariablen von Delphi IDE erben. Hier ist, wie ich die Umgebungsvariablen extrahieren:

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; 

Dies ist eine Liste von Umgebungsvariablen für einen Prozess ins Leben gerufen von Delphi XE „Lauf ohne Debugging“:

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 

Und dies ist eine Liste der Umgebung Variablen für einen Prozess von Windows Explorer gestartet:

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 

2 Liste der Umgebungsvariablen vergleichen, können Sie doesn gibt es nur wenige Variablen wie BDSINCLUDE und BDSBIN bemerken‘ t existieren in Prozess von Windows Shell gestartet. Diese Umgebungsvariablen aus der Delphi XE-IDE haben sich auf das ANT-Skript ausgewirkt, das die Delphi 2007/2010-Anwendung erstellt. Mein Problem sollte gelöst werden, wenn diese Delphi-IDE-Umgebungsvariablen nicht im Prozess angezeigt werden.

Hat jemand Ideen, wenn es möglich ist, den Prozess (entweder mit oder ohne Debugging) von Delphi IDE zu starten, die Umgebungsvariablen nicht von Delphi IDE erben?

Antwort

6

Vielen Dank für Rob Kennedy Hinweise. Ich habe versucht, SetEnvironmentVariable zu verwenden, um Variable eins nach dem anderen zu vernichten. Eine der Umgebungsvariablen Platform = Win32 von Delphi IDE verursacht das Problem.

SetEnvironmentVariable('Platform', nil); 

Setzen Sie die Plattform auf Null, damit ANT Build wie erwartet funktioniert.

+0

Plattform, das ist eine neue in Rad XE, denke ich. –

9

Ein Programm erbt die Umgebung des Prozesses, der es startet. Es gibt keinen Grund für Delphi, die Umgebung trotzdem zu räumen; Programme sollten für jede beliebige Umgebung vorbereitet sein, mit der sie beginnen.

Wenn Ihr Programm beim Festlegen bestimmter Umgebungsvariablen fehlschlägt, müssen Sie Ihr Programm ansprechen. Sie können Einträge aus der Umgebung Ihres Programms mit SetEnvironmentVariable löschen; Übergeben Sie einen Nullzeiger als zweiten Parameter. Oder Sie können herausfinden, warum Ihr Programm so empfindlich auf scheinbar nicht verwandte Variablen reagiert und es ändert.

Sie können auch eine neue Umgebung erstellen und sie verwenden, wenn Ihr Programm Ant startet. Übergeben Sie es als siebten Parameter an CreateProcess. Legen Sie die gewünschten Werte fest oder entfernen Sie sie.

Verwandte Themen