【问题标题】:Reading the output file of ShellExecute() in Delphi 2010?在 Delphi 2010 中读取 ShellExecute() 的输出文件?
【发布时间】:2010-06-29 13:27:10
【问题描述】:

我使用 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 文件。在我的程序的每次运行中,输入文件都会发生变化,输出文件也会发生变化。

问题是这样的:我看不到输出文件的变化!控制台中写入的行来自上一个文件,而不是新更改的文件。我的意思是,资源管理器中的文件已更改,但我读取的文件仍然是旧文件。

这似乎有点奇怪,但我想知道在阅读之前有没有办法刷新输出文件?还是我在这里遗漏了什么?

提前致谢。

【问题讨论】:

    标签: delphi delphi-2010 shellexecute


    【解决方案1】:

    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' 你知道问题是什么吗?我完全迷路了!
    • Delphi 2010 使用 Unicode 版本的 CreateProcess()(又名 CreateProcessW())。不要将字符串文字传递给 CreateProcessW()! MSDN 说它可以修改输入字符串,这将是非常糟糕的(正如您已经发现的那样)。您需要先将文字分配给引用计数的 String 变量,即: var S: String; S := 'test.exe input.txt output.txt';唯一字符串(S); if CreateProcess(nil, PChar(S), ...);
    • 非常感谢雷米!你让我开心,伙计。它就像一个魅力!一百万年后,我不会猜这是问题所在!我讨厌德尔福的例外!我从来不明白它们的意思和指代。
    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多