2010-12-08 10 views
5

Apache ANTスクリプトを呼び出そうとするWindows GUIアプリケーションを作成しています。 ANTスクリプトは、Delphiプロジェクトグループをビルドして最終的なsetup.exeにパックします。 ANTスクリプトはDelphi 2007/2010とDelphi XEアプリケーションをビルドします。Delphi IDEの「デバッグなしで実行」プロセスがIDEの環境変数を継承します

私のANT GUIアプリケーションは、Delphi XEによってコンパイルされ、ビルドされています。 Delphi XEで "Run without Debugging"を使用してアプリケーションを実行すると、アプリケーションはANTスクリプトで正しく動作しません。 ANTスクリプトは、DCU、BPL、およびEXEが、期待したフォルダにコンパイルされていないアプリケーションをビルドしません。

ただし、WindowsエクスプローラでGUIアプリケーションを起動すると、ANTスクリプトでアプリケーションが正しくビルドされます。>すべてのDCU、BPLおよびEXEがビルドされ、割り当てられたフォルダに保持されます。

GUIアプリケーションをデバッグした後、Delphiの「Run without debugging」で実行されるアプリケーションが、Delphi IDEから環境変数を継承することがわかりました。ここで私は環境変数を抽出する方法である:

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 

そして、これは、環境のリストです:

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; 

これは、Delphi XEの「ファイル名を指定して実行デバッグなし」が立ち上げプロセスの環境変数のリストです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 

は、環境変数の2リストを比較、あなたは「doesnのBDSINCLUDEとBDSBINのようないくつかの変数があることに気づきますWindowsシェルによって起動されたプロセスに存在しません。 Delphi XEのIDEの環境変数は、Delphi 2007/2010アプリケーションを構築するANTスクリプトに影響を与えました。それらのDelphi IDE環境変数がプロセスに表示されない場合、私の問題は解決するはずです。

Delphi IDEの環境変数を継承しないDelphi IDEからプロセスを起動することができますか(デバッグなしで実行するか、実行しないか)。

答えて

6

Rob Kennedyのヒントありがとうございます。 SetEnvironmentVariableを使用して、変数を1つずつゼロにしようとしました。 Delphi IDEによって環境変数Platform = Win32が課した問題の1つが原因です。

SetEnvironmentVariable('Platform', nil); 

プラットフォームをnilに設定すると、期待通りにANTビルドが行われます。

+0

プラットフォーム、これはRad XEの新しいものだと思います。 –

9

プログラムは、プログラムを起動するプロセスの環境を継承します。とにかく環境をクリアする理由はありません。プログラムは、始まった任意の環境のために用意されている必要があります。

特定の環境変数が設定されているときにプログラムが失敗した場合は、そのプログラムに対処する必要があります。プログラムの環境からエントリを削除するには、SetEnvironmentVariableを使用します。第2のパラメータとしてヌルポインタを渡します。あるいは、あなたのプログラムが一見無関係な変数に非常に敏感で、それを変更する理由を理解することができます。

また、新しい環境を生成し、プログラムの起動時にAntを使用することもできます。 7番目のパラメータとしてCreateProcessに渡します。必要な値を設定または削除します。

関連する問題