如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

码头

我有Delphi代码,该代码用于通过给定的参数集从JAVA_HOME运行Java.exe。这是通过将命令行命令传递给CreateProcess()来实现的。对于一组特定的输入参数,这给我一个错误,提示“无法创建Java虚拟机”。我需要通过PeekNamedPipe()将其获取到Delphi代码中,并将其显示在应用程序中。我该如何实现?Delphi代码如下所示:

  begin
  securityAttr.nlength := SizeOf(TSecurityAttributes);
  securityAttr.binherithandle := true;
  securityAttr.lpsecuritydescriptor := nil;

  if CreatePipe (readPipe, writePipe, @securityAttr, 0) then
  begin

  buffer  := AllocMem(READ_BUFFER + 1);
  FillChar(startInfo, Sizeof(startInfo), #0);
  startInfo.cb          := SizeOf(startInfo);
  startInfo.hStdOutput  := writePipe;
  startInfo.hStdInput   := readPipe;
  startInfo.dwFlags     := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
  startInfo.wShowWindow := SW_HIDE;

  if SearchPath(nil, PChar(consoleApp), '.exe', SizeOf(consoleAppBuf), consoleAppBuf, exeName) = 0 then
  raise EInOutError.CreateFmt('Could not find file %s', [consoleApp]);

FmtStr(commandLine, '"%s" %s', [consoleAppBuf, parameters]);

if CreateProcess(nil, PChar(commandLine), nil, nil, true, CREATE_NO_WINDOW, nil, nil, startInfo, processInfo) then
begin

  totalBytesRead := 0;

  repeat        
    exitCode := WaitForSingleObject(ProcessInfo.hProcess, 100);
    Application.ProcessMessages;

    if (PeekNamedPipe(readPipe, @buffer[totalBytesRead],
                         READ_BUFFER, @bytesRead,
                         @totalBytesAvail, @bytesLeftThisMessage)) then
    begin

      if (bytesRead > 0) then
        ReadFile(readPipe, buffer[totalBytesRead], bytesRead, bytesRead, nil);

      totalBytesRead := totalBytesRead + bytesRead;

    end;

  until (exitCode <> WAIT_TIMEOUT);

  GetExitCodeProcess(ProcessInfo.hProcess, result);

  buffer[totalBytesRead]:= #0;
  OemToChar(buffer, buffer);
  output.Text := output.Text + StrPas(buffer);

  FreeMem(buffer);
  CloseHandle(processInfo.hProcess);
  CloseHandle(processInfo.hThread);
  CloseHandle(readPipe);
  CloseHandle(writePipe);

end
else
  RaiseLastWin32Error;

end;

如何读取java.exe引发的错误?

戴维·赫弗南

将同一管道的两端连接到同一过程的输入和输出是错误的。您正在将流程的输出反馈回其输入。保留hStdInputNULL

您还会通过错误检查快速而轻松地玩游戏,并且由于不使用finally积木,因此存在句柄泄漏的风险而且我也不喜欢忙碌的循环。或致电ProcessMessages

撇开所有这些,您不阅读错误的可能原因是它们进入了stderr。将管道的写入端连接到stderr以及stdout:

startInfo.hStdOutput  := writePipe;
startInfo.hStdError  := writePipe;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

来自分类Dev

如何在ConEmu中运行C ++控制台程序(这是独立的C ++文件,而不是Code :: Blocks中的控制台应用程序项目)?

来自分类Dev

如何从C#中的控制台应用程序运行Web应用程序

来自分类Dev

如何从控制台或GUI应用程序检测运行?

来自分类Dev

如何在控制台应用程序中从config.json读取值

来自分类Dev

运行控制台应用程序 Windows CMD 后如何清除控制台?

来自分类Dev

如何在MVC中运行控制台应用程序

来自分类Dev

如何在Windows窗体中运行控制台应用程序代码?

来自分类Dev

如何在MVC中运行控制台应用程序

来自分类Dev

如何在Angular应用程序中获取所有控制台错误消息

来自分类Dev

如何使Visual Basic 2015表单应用程序作为控制台应用程序运行

来自分类Dev

如何使用Windows窗体应用程序按钮在Visual Studio 2010中运行控制台文件?

来自分类Dev

如何使用批处理文件中的参数运行ac#控制台应用程序

来自分类Dev

Delphi控制台应用程序:如何在消息对话框中添加OnHelp?

来自分类Dev

如何使用Windows应用程序启动控制台应用程序并读取(监视)命令行-在C#中逐行实时

来自分类Dev

如何在控制台应用程序中读取txt文件并将其显示为表格?

来自分类Dev

尝试使用 node.js 中的 readline 从控制台读取输入,但应用程序不等待输入

来自分类Dev

在Visual Basic中如何在控制台应用程序中运行与主模块不同的模块?

来自分类Dev

OSX。如何使用参数运行控制台应用程序?

来自分类Dev

如何读取Windows服务启动的控制台应用程序的输出

来自分类Dev

读取在C ++中使用控制台应用程序打开的文件

来自分类Dev

如何使用VS Code(Windows平台)编译控制台应用程序?

来自分类Dev

如何使.net Core 3.1控制台应用程序中的控制台记录器正常工作

来自分类Dev

如何使用控制台应用程序中appSettings中的值创建循环

来自分类Dev

如何构建在.NET CoreCLR上运行的hello-world控制台应用程序?

来自分类Dev

如何获取Symfony控制台应用程序的运行路径?

来自分类Dev

其他项目构建失败时如何运行控制台应用程序

来自分类Dev

如何知道应用程序是从控制台还是资源管理器运行的?

来自分类Dev

如何检查YII应用程序是从控制台还是从浏览器运行?

Related 相关文章

  1. 1

    如何使用PeekNamedPipe()从Delphi Code中读取运行控制台应用程序的错误

  2. 2

    如何在ConEmu中运行C ++控制台程序(这是独立的C ++文件,而不是Code :: Blocks中的控制台应用程序项目)?

  3. 3

    如何从C#中的控制台应用程序运行Web应用程序

  4. 4

    如何从控制台或GUI应用程序检测运行?

  5. 5

    如何在控制台应用程序中从config.json读取值

  6. 6

    运行控制台应用程序 Windows CMD 后如何清除控制台?

  7. 7

    如何在MVC中运行控制台应用程序

  8. 8

    如何在Windows窗体中运行控制台应用程序代码?

  9. 9

    如何在MVC中运行控制台应用程序

  10. 10

    如何在Angular应用程序中获取所有控制台错误消息

  11. 11

    如何使Visual Basic 2015表单应用程序作为控制台应用程序运行

  12. 12

    如何使用Windows窗体应用程序按钮在Visual Studio 2010中运行控制台文件?

  13. 13

    如何使用批处理文件中的参数运行ac#控制台应用程序

  14. 14

    Delphi控制台应用程序:如何在消息对话框中添加OnHelp?

  15. 15

    如何使用Windows应用程序启动控制台应用程序并读取(监视)命令行-在C#中逐行实时

  16. 16

    如何在控制台应用程序中读取txt文件并将其显示为表格?

  17. 17

    尝试使用 node.js 中的 readline 从控制台读取输入,但应用程序不等待输入

  18. 18

    在Visual Basic中如何在控制台应用程序中运行与主模块不同的模块?

  19. 19

    OSX。如何使用参数运行控制台应用程序?

  20. 20

    如何读取Windows服务启动的控制台应用程序的输出

  21. 21

    读取在C ++中使用控制台应用程序打开的文件

  22. 22

    如何使用VS Code(Windows平台)编译控制台应用程序?

  23. 23

    如何使.net Core 3.1控制台应用程序中的控制台记录器正常工作

  24. 24

    如何使用控制台应用程序中appSettings中的值创建循环

  25. 25

    如何构建在.NET CoreCLR上运行的hello-world控制台应用程序?

  26. 26

    如何获取Symfony控制台应用程序的运行路径?

  27. 27

    其他项目构建失败时如何运行控制台应用程序

  28. 28

    如何知道应用程序是从控制台还是资源管理器运行的?

  29. 29

    如何检查YII应用程序是从控制台还是从浏览器运行?

热门标签

归档