Windows 主程序(Pari/GP、cygwin?)中控制台子进程缺少管道输出

Windows 主程序(Pari/GP、cygwin?)中控制台子进程缺少管道输出,windows,delphi,cygwin,pipe,pari,Windows,Delphi,Cygwin,Pipe,Pari,我有一个用于数学控制台程序Pari/GP的用户GUI(Delphi6,32位):我在一个不可见的子流程窗口中调用Pari/GP,并使用管道STDIN和STDOUT进行通信,据我从Delphi中控制台子流程的源代码(也是STDERR)中所知 从Pari/GP版本2.2.11到版本2.4左右,一切正常,我通过等待提示来确定与子流程的通信(异步)的开始和结束。但是自从版本2.5以来,管道不再得到提示。但是,当我在cmd窗口中启动Pari/GP时,我有完整的对话框,包括提示。(我使用的是Win7,64位

我有一个用于数学控制台程序Pari/GP的用户GUI(Delphi6,32位):我在一个不可见的子流程窗口中调用Pari/GP,并使用管道STDIN和STDOUT进行通信,据我从Delphi中控制台子流程的源代码(也是STDERR)中所知

从Pari/GP版本2.2.11到版本2.4左右,一切正常,我通过等待提示来确定与子流程的通信(异步)的开始和结束。但是自从版本2.5以来,管道不再得到提示。但是,当我在cmd窗口中启动Pari/GP时,我有完整的对话框,包括提示。(我使用的是Win7,64位,但这似乎与此无关,在使用XP,32位的虚拟机中的行为是相同的)

我没有Pari/GP软件的源代码,但两个版本之间可能存在一个显著的差异,即较新版本没有外部cygwin.dll

问:这种行为是否已经为人所知,以及其原因?已知的解决方法?同时也暗示了最有可能的原因是什么


根据要求,提供更多的背景资料。 在Delphi-6中,我使用了“createconsoleprocess”(由Jedi project实现)过程,该过程为不可见的子进程和两个稍有不同的永久线程提供了一个
writeln()
,它们通过管道异步等待响应(我假设,
stdout
)。这对于所有版本来说都很好。
但在旧版本中,每次响应时都会出现Pari/GP
提示符
(只是一些字符,如Dos窗口中的Dos提示符)。附加到答案的最后一部分,以便我可以分析响应的各个部分,直到出现
提示
-符号,然后可以通过stringlist将完整的答案显示为Pari/GP输出给用户

在版本Pari/GP 2.5之后,该提示不再出现,因此如果我不进行任何更正,用户将无限期地等待Pari/GP响应的完成。我不可能——通过更改提示和回音的软件标志,或者通过在管道定义中用
stderr
替换
stdout
——生成提示。疯狂:如果我只是通过cmd在一个单独的windows控制台中启动Pari/GP,那么提示符就在那里-就好像有一个新管道,它是
createconsoleprocess
所不知道的,但windows操作系统知道的,并且提示符是通过这个新管道发送的

对这些版本唯一可能相关且可见的修改似乎是,旧版本有一个带有Pari/GP的
cygwin.dll
,而新版本没有。但是我不知道cygwin的秘密,尽管我之前下载了一些文档-但这根本不是我的专长

这是一张显示通信原理的图片。我们看到我的GUI窗口,它有一个Pari/GP子进程,它通过CreateConsoleProcess过程提供的STDIN/STDOUT管道在后台与之通信。


我还有一个精确的调试工具,可以精确地显示管道上的字符串流。简单地说,在较新版本中,提示字符串不再附加在STDOUT消息的末尾(我也无法通过STDERR通信找到它),但是简单的cmd控制台窗口有此提示,因此它必须在任何地方……

,这个问题与已知的cygwin不兼容等问题无关,因此stackoverflow可能不是提出这个问题的最佳场所,因此我在这里结束这个案例。
搜索结果:在调查了Pari/GP版本的c源代码之后,我似乎找到了原因。除了通过stdout之外,我找不到write()(或环绕它),因此他们可能已经为提示符引入了另一种/一种新类型的管道

虽然我不熟悉c语言,但在我看来,在将结果放入输出通道的关键例程中,有一个代码,在发送之前从输出字符串中删除先前添加的提示字符串。这里有一些标志和if s和else s,因此它们可能会在前面确定程序是由dos/windows控制台启动的(然后保留提示字符串)还是由其他进程启动的(然后删除提示字符串)-有一个名为isinteractive的标志,其中包括在该源代码段中切换的标志

因此,缺少cygwin.dll的影响问题可能与这个特定问题无关-除了这就是没有设置标志的原因


我将尝试与软件作者联系以获得具体帮助。

至于我,gp从标准DIN管道Win8+PARI/gp 32位2.7.3中读取的内容很好。例如,
echo打印(1+1);|gp-q-s 450000000
按预期将
2
打印到标准输出。请分享你最简单的不起作用的例子。我投票将这个问题作为离题题来结束,因为OP已经确定不需要的行为是由于他正在使用的第三方应用程序,而不是在他自己的代码中表示错误。可能太天真了,但是你是否尝试过检查Pari中的默认列表(type
default()
查看全部,或
默认值(x,y)
将默认值
x
更改为
y
)?Pari安装文件夹中有一个文件
gprc.txt
,其中包含启动时设置的一些默认值。尝试在文件中的所有行前加上前缀
\\\
@Jeppe注释-是的,我尝试了通过Pari/GP、defaults、gprc.txt等访问的所有内容。否:提示不再可见-仅当我在windows控制台中打开Pari/GP,并且只有打字机功能,没有复制和粘贴、编辑功能时