delphi中调用外部console的exe程序的问题

小小爬虾 2019-06-30 09:12:35
我用其他语言做了一个console的exe小程序,然后用delphi 7做界面(主要是输入),再用ShellExecuteEx执行这个外部程序,这时会弹出cmd黑色框执行外部程序并显示执行过程。

虽然功能也能实现,但总感觉很low,不太友好。

如何将外部程序的执行过程显示在delphi的界面里面,而且不弹出黑色框呢?
...全文
124 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2019-07-04
  • 打赏
  • 举报
回复
引用 3 楼 kxltsuperr 的回复:
[quote=引用 2 楼 ooolinux的回复:]利用windows管道技术。
是指的sendmessage吗[/quote] 不是。你可以先百度一下,不然代码不是很好理解。
ooolinux 2019-07-04
  • 打赏
  • 举报
回复
利用windows管道技术。
小小爬虾 2019-07-04
  • 打赏
  • 举报
回复
引用 2 楼 ooolinux的回复:
利用windows管道技术。
是指的sendmessage吗
风轻狂 2019-07-03
  • 打赏
  • 举报
回复

function GetRunConsoleResult(FileName: string; Visibility: Integer; var mOutputs: string): Integer;
var
  sa: TSecurityAttributes;
  hReadPipe, hWritePipe: THandle;
  ret: BOOL;
  strBuff: array[0..255] of char;
  lngBytesread: DWORD;
  WorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(sa, Sizeof(sa), #0);
  sa.nLength := Sizeof(sa);
  sa.bInheritHandle := True;
  sa.lpSecurityDescriptor := nil;
  if not (CreatePipe(hReadPipe, hWritePipe, @sa, 0)) then
  begin
    Result := -2;  //通道创建失败
  end;
  WorkDir := ExtractFileDir(Application.ExeName);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  StartupInfo.wShowWindow := Visibility;

  StartupInfo.hStdOutput := hWritePipe;
  StartupInfo.hStdError := hWritePipe;

  if not CreateProcess(nil, PChar(FileName),               { pointer to command line string }
    @sa,                           { pointer to process security attributes }
    @sa,                           { pointer to thread security attributes }
    True,                          { handle inheritance flag }
    NORMAL_PRIORITY_CLASS, nil,                           { pointer to new environment block }
    PChar(WorkDir),                { pointer to current directory name, PChar}
    StartupInfo,                   { pointer to STARTUPINFO }
    ProcessInfo)                   { pointer to PROCESS_INF }
    then
    Result := INFINITE {-1 进程创建失败}
  else
  begin
    CloseHandle(hWritePipe);
    mOutputs := '';
    while ret do
    begin
      FillChar(strBuff, Sizeof(strBuff), #0);
      ret := ReadFile(hReadPipe, strBuff, 256, lngBytesread, nil);
      mOutputs := mOutputs + strBuff;
    end;

    Application.ProcessMessages;
    //等待console结束
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
    CloseHandle(ProcessInfo.hProcess);  { to prevent memory leaks }
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(hReadPipe);
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  strOut: string;
begin
  GetRunConsoleResult('help.exe', SW_HIDE, strOut);
  mmo1.Text := strOut;
end;

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧