在Delphi 2010中读取ShellExecute()的输出文件?
我使用ShellExecute命令运行一个exe文件,该文件获取一个输入文本文件并返回一个输出文本文件。我是这样写的:在Delphi 2010中读取ShellExecute()的输出文件?,delphi,delphi-2010,shellexecute,Delphi,Delphi 2010,Shellexecute,我使用ShellExecute命令运行一个exe文件,该文件获取一个输入文本文件并返回一个输出文本文件。我是这样写的: ShellExecute(mainFormHandle, 'open', 'Test.exe', 'input.txt output.txt', nil, sw_shownormal); //Read the output file... S_List.LoadFromFile('output.txt'); Writeln(S_List[0]) var Star
ShellExecute(mainFormHandle, 'open', 'Test.exe',
'input.txt output.txt', nil, sw_shownormal);
//Read the output file...
S_List.LoadFromFile('output.txt');
Writeln(S_List[0])
var
StartUpInfo : TStartUpInfo;
ProcessInfo : TProcessInformation;
CreationFlags : Cardinal;
begin
FillChar(StartUpInfo, SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
CreationFlags := Normal_Priority_Class;
if CreateProcess(nil, 'test.exe input.txt output.txt',
nil, nil, False, CreationFlags,
nil, 0, StartupInfo, ProcessInfo) then
begin
WaitforSingleObject(ProcessInfo.HProcess, INFINITE);
CloseHandle(ProcessInfo.HProcess);
//Read the output file...
S_List.LoadFromFile('output.txt');
end;
在运行此命令之前,我提供了input.txt文件。在我的程序的每次运行中,输入文件和输出文件都会发生变化
问题是:我看不到输出文件中的更改!控制台中写入的行来自上一个文件,而不是新更改的文件。我的意思是,资源管理器中的文件已更改,但我读取的文件仍然是旧文件
这似乎有点奇怪,但我想知道有没有办法在读取输出文件之前刷新它?或者我在这里遗漏了什么
提前谢谢
ShellExecute
不会等待程序完成工作。情况就是这样:
- Test.exe启动
- 您可以在output.txt中读取
- Test.exe写入新的output.txt
ShellExecute(mainFormHandle, 'open', 'Test.exe',
'input.txt output.txt', nil, sw_shownormal);
//Read the output file...
S_List.LoadFromFile('output.txt');
Writeln(S_List[0])
var
StartUpInfo : TStartUpInfo;
ProcessInfo : TProcessInformation;
CreationFlags : Cardinal;
begin
FillChar(StartUpInfo, SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
CreationFlags := Normal_Priority_Class;
if CreateProcess(nil, 'test.exe input.txt output.txt',
nil, nil, False, CreationFlags,
nil, 0, StartupInfo, ProcessInfo) then
begin
WaitforSingleObject(ProcessInfo.HProcess, INFINITE);
CloseHandle(ProcessInfo.HProcess);
//Read the output file...
S_List.LoadFromFile('output.txt');
end;
使用
WaitForSingleObject
您可以等到流程完成工作。谢谢您的回答。我把它放在我的项目中,但它给了我一个例外:第一次机会的例外是75819617美元。异常类EAccessViolation,消息为“模块'kernel32.dll'中地址75BB9783处的访问冲突”。写下地址004F70C2‘你知道问题出在哪里吗?我在这里完全迷路了!Delphi 2010使用Unicode版本的CreateProcess()(也称为CreateProcessW())。不要将字符串文本传递给CreateProcessW()!MSDN说它可以修改输入字符串,这将非常糟糕(正如您已经发现的)。您需要首先将文本分配给引用计数字符串变量,即:var S:String;S:=“test.exe input.txt output.txt”;唯一字符串;如果CreateProcess(无,PChar,…);非常感谢雷米!你让我开心,伙计。它就像一个符咒!一百万年后,我猜这不是问题所在!我讨厌德尔福的例外!我从来都不明白他们的意思和指的是什么。