lazarus 利用TProcess调用命令行无法获取输出的原因分析

之前用lazarus写GUI程序,调用一个exe来执行一些操作,示例见下

function TMainForm.GetPDFPageCount(const PDFPath: string): integer;
var
  success: boolean;
  outs: string;
begin
  Result := 0;
  success := RunCommand('pdftk.exe', [Utf8ToAnsi(PDFPath) + ' dump_data'], outs, [poNewProcessGroup, poUsePipes], swoHIDE);
  if success then
  begin
    Result := ExtractNumberOfPages(outs);
    if Result = -1 then
      Result := 0;
  end;
end;

这是用pdftk获取PDF的页面数据,在控制台执行能够正常获取输出,但是在lazarus里,却会卡死。这个问题一直没有解决,最后换用cmd /c 执行pdftk才解决。但卡死的原因仍未找到。

function TMainForm.GetPDFPageCount(const PDFPath: string): integer;
var
  success: boolean;
  outs: string;
begin
  Result := 0;
  success := RunCommand('cmd.exe', ['/c', 'pdftk.exe ' + Utf8ToAnsi(PDFPath) + ' dump_data'], outs, [poNewProcessGroup, poUsePipes], swoHIDE);
  if success then
  begin
    Result := ExtractNumberOfPages(outs);
    if Result = -1 then
      Result := 0;
  end;
end;

今天,偶然在群里看到一个截图。

才意识到,Process有PipeBuffersize这个属性,我感觉到问题所在找到了。

去看lazarus的源码,发现如果不设置这个参数,默认值是1024,也就是1KB,非常小。

而用cmd,则是绕过了这个限制。

所以,在代码里设置即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值