Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi 2010中读取ShellExecute()的输出文件?_Delphi_Delphi 2010_Shellexecute - Fatal编程技术网

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

在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命令运行一个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
  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,…);非常感谢雷米!你让我开心,伙计。它就像一个符咒!一百万年后,我猜这不是问题所在!我讨厌德尔福的例外!我从来都不明白他们的意思和指的是什么。