次のコードは、CreateProcess
を使用して環境変数でコマンドを実行します。ここでは、notepad %APPDATA%\test.txt
を実行しようとします。CreateProcessでインスタンス化されたコマンドで環境変数を使用または展開する方法は?
notepad %APPDATA%\test.txt
を直接Windows' CMD
以内で実行すると、%APPDATA%が展開されます。ただし、環境変数はCreateProcess
で実行すると拡張できません。理由と回避策についてコメントしてもらえますか?すべてのコメントをいただければ幸いです!
program TestConsole2;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
var
I: Integer;
ProgramName: String;
StartInfo : TStartupInfo;
ProcInfo : TProcessInformation;
CreateOK : Boolean;
begin
try
FillChar(StartInfo, SizeOf(StartInfo), #0);
FillChar(ProcInfo, SizeOf(ProcInfo), #0);
StartInfo.cb := SizeOf(StartInfo);
ProgramName := 'NOTEPAD %APPDATA%\test.txt';
CreateOK := CreateProcess(
nil, PChar(ProgramName), nil, nil, True, 0, nil, nil, StartInfo, ProcInfo);
if CreateOK then WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Readln(ProgramName);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
あなたの知識豊かなコメントありがとう! :) – SOUser