3

我正在创建一个 PHP 文件以将值传递给 c++ .exe,然后它将计算输出并返回该输出。但是,我似乎无法将 .exe 的输出返回到 PHP 文件中。

PHP代码:

$path = 'C:enter code here\Users\sumit.exe';
$handle = popen($path,'w');
$write = fwrite($handle,"37");
pclose($handle);

C++ 代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

// Declaation of Input Variables:
int main()
{
int num;
cin>> num;

std::cout<<num+5;
return 0;
}
4

3 回答 3

3

我既不建议system也不建议命令:popenphp.netproc_open

像这样称呼它

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr, also a pipe the child will write to
);
proc_open('C:enter code here\Users\sumit.exe', $descriptorspec, $pipes);

之后,您将$pipes填充句柄以将数据发送到程序 ( [0]) 并从程序 ( ) 接收数据[1]。您还[2]可以使用它从程序中获取 stderr(或者如果您不使用 stderr,则直接关闭)。

不要忘记使用 关闭进程句柄proc_close()和使用fclose(). $pipes[0]请注意,在您关闭句柄或写入一些空白字符之前,您的程序不会知道输出是否完整。我建议关闭管道。

system()在or中使用命令行参数popen()是有效的,但如果您打算发送大量数据和/或原始数据,您将遇到命令行长度限制和转义特殊字符的问题。

于 2013-03-11T14:53:34.690 回答
1

在您的 C++ 代码中,我没有看到任何用于传递您需要的变量

 int main(int argc, char* argv[])

代替

 int main()

请记住 argc 是变量的计数,它包括文件的路径,因此您的参数从 1 开始,每个 argv 都是该参数的 c 字符串。如果您需要小数 atof 是您的朋友或 atoi 为整数。

然后你正在使用popen。 PHP 文档说它只能用于读取或写入。它不是双向的。您想使用proc_open来获得双向支持。

无论如何,这就是我编写 C++ 代码的方式:

#include "stdafx.h"
#include <iostream>

// Declaation of Input Variables:
int main(int arc, char* argv[])
{
   int num;
   num = atoi(argv[1]);

   std::cout<<num+5;
   return 0;
 }

注意:我删除using namespace std是因为我注意到您仍在尝试在主函数(即std::cout)中使用名称空间,最好将其保留在全局名称空间之外。

于 2013-03-11T14:47:26.490 回答
0

您正在写入 exe 文件,您应该传递您的参数,例如

system("C:enter code here\Users\sumit.exe 37");
于 2013-03-11T14:36:48.083 回答