在Delphi 2010中读取ShellExecute()的输出文件?

3

我使用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])
我在运行这个命令之前提供了input.txt文件。在每次程序运行时,输入文件都会发生变化,输出文件也会随之变化。 问题是:我看不到输出文件的变化!控制台中写的行来自上一个文件,而不是新更改的文件。我的意思是,资源管理器中的文件已更改,但我读取的文件仍然是旧文件。 这似乎有点奇怪,但我想知道是否有任何方法可以在阅读文件之前刷新输出文件?或者我在这里漏了什么? 先谢谢你。
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11

ShellExecute 不会等待你的程序完成工作。情况如下:

  • Test.exe 开始运行
  • 你读取 output.txt
  • Test.exe 写入新的 output.txt

尝试使用以下代码:

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”您有什么想法是什么问题吗?我完全迷失了! - Mahm00d
Delphi 2010使用CreateProcess()的Unicode版本(又名CreateProcessW())。不要将字符串字面量传递给CreateProcessW()!MSDN表示它可以修改输入字符串,这将非常糟糕(正如您已经发现的那样)。您需要首先将文字分配给引用计数的String变量,即:var S:String; S:='test.exe input.txt output.txt'; UniqueString(S);如果CreateProcess(nil,PChar(S),...); - Remy Lebeau
非常感谢你,Remy!你让我今天过得很愉快。它像魔法一样奏效了!我百万年也猜不到那是问题所在!我讨厌 Delphi 的异常!我从来不明白它们的含义和指向。 - Mahm00d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,