加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 执行后台程序并继续执行代码?

发布时间:2020-12-15 09:38:59 所属栏目:大数据 来源:网络整理
导读:我想从我的Delphi代码运行后台应用程序.打开的应用程序是基于DOS的EXE,它将内容输出到DOS窗口.该程序将无限期地打开,直到它从任务管理器关闭.我用来打开应用程序的当前代码是; procedure CaptureConsoleOutput(const ACommand,AParameters: String; CallBack
我想从我的Delphi代码运行后台应用程序.打开的应用程序是基于DOS的EXE,它将内容输出到DOS窗口.该程序将无限期地打开,直到它从任务管理器关闭.我用来打开应用程序的当前代码是;

procedure CaptureConsoleOutput(const ACommand,AParameters: String; CallBack: TArg<PAnsiChar>);
const
    CReadBuffer = 2400;
var
    saSecurity: TSecurityAttributes;
    hRead: THandle;
    hWrite: THandle;
    suiStartup: TStartupInfo;
    piProcess: TProcessInformation;
    pBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dRead: DWord;
    dRunning: DWord;
begin
    saSecurity.nLength := SizeOf(TSecurityAttributes);
    saSecurity.bInheritHandle := True;
    saSecurity.lpSecurityDescriptor := nil;

    if CreatePipe(hRead,hWrite,@saSecurity,0) then
    begin
        FillChar(suiStartup,SizeOf(TStartupInfo),#0);
        suiStartup.cb := SizeOf(TStartupInfo);
        suiStartup.hStdInput := hRead;
        suiStartup.hStdOutput := hWrite;
        suiStartup.hStdError := hWrite;
        suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        suiStartup.wShowWindow := SW_HIDE;

        if CreateProcess(nil,pChar(ACommand + ' ' + AParameters),True,NORMAL_PRIORITY_CLASS,nil,suiStartup,piProcess) then
        begin
            repeat
                dRunning := WaitForSingleObject(piProcess.hProcess,100);
                //Application.ProcessMessages();
                repeat
                    dRead := 0;
                    ReadFile(hRead,pBuffer[0],CReadBuffer,dRead,nil);
                    if(dRead > 0) then
                    begin
                      pBuffer[dRead] := #0;
                      //ShowMessage(pBuffer);
                      //OemToAnsi(pBuffer,pBuffer);
                      //Unicode support by Lars Fosdal
                      OemToCharA(pBuffer,dBuffer);
                      CallBack(dBuffer);
                    end;
                until (dRead < CReadBuffer);
            until (dRunning <> WAIT_TIMEOUT);
            CloseHandle(piProcess.hProcess);
            CloseHandle(piProcess.hThread);
        end;
        CloseHandle(hRead);
        CloseHandle(hWrite);
    end;
end;

这很好,但是因为程序没有“退出”并永远保持打开状态,我的应用程序挂起,代码永远不会移动.

任何帮助,将不胜感激

解决方法

如果您不需要对生成的进程执行任何操作,则只需关闭CreateProcess()返回的句柄并继续,该进程将继续运行.但是,由于您似乎需要从生成的进程的输出中连续读取,您只需将该逻辑移动到工作线程中,这样您的主代码就不会被阻止了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读