我有一个旧应用程序,我试图在 Azure 工作人员下运行。该应用程序使用一种相当常见的模式来启动子进程,方法是创建一个匿名管道、将标准输出重定向到该管道、生成一个子进程,然后使用该管道进行通信。
为了让它在 Azure 下运行,我对启动整个过程的 dll 进行了 P/Invoke 调用。
所有这些在 Azure 之外都可以正常工作,但即使在模拟器下运行也会失败。
在 Azure 下运行时,proc 无法通过管道进行通信。具体来说,父级对管道句柄的读取调用失败(超时)。
我终于发现问题是因为遗留代码复制了标准输出句柄以传递给子进程。
在 Azure 下运行时,STDOUT 的 GetStdHandle 返回 0x0。这基本上意味着,“没有错误,但你没有 STDOUT”。显然,您需要检查 0x0 和 INVALID_HANDLE。
创建句柄,在启动子项之前将它们设置在 STARTUPINFO 上,而不是复制现有的句柄来修复所有问题。
我有以下两个建议:
让我知道你的结果是什么。