之前用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,则是绕过了这个限制。
所以,在代码里设置即可