如何调用外部程序并在C/C++中获取多个return值?
How to call an external program and get multiple return values in C/C++?
我有一个可执行程序 myApp
(或 Windows 中的 myApp.exe
)。我想在 C/C++ 程序中调用这个可执行文件,在 Qt 中使用 system("myApp")
或 QProcess:execute("myApp")
。
我想从 myApp
中获取多个 return 值,所以在调用这个可执行文件时,我传递了 pointers 作为参数,就像这样(在 Qt 中)
float *pStates = new float[nState];
float *pControl = new float[nControl];
pControl[0] = 0.1;
pControl[1] = 0.2;
QString proStr;
proStr = "myApp ";
for (int i = 0; i < nState; i++)
{
proStr += (QString::number((uint64_t)pStates + i * sizeof(float)) + " ");
}
for (int i = 0; i < nControl; i++)
{
proStr += (QString::number(pControl[i]) + " ");
}
QProcess::execute(proStr);
proStr
字符串可能看起来像
myApp 140483171852384 140483171852388 140483171852392 140483171852396 140483171852400 0.1 0.2
这里的140483xxx数是pStates
的指针或物理地址。
而 myApp
的代码看起来像
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 8)
{
return 1;
}
float *x = atoi(argv[1]);
float *y = atoi(argv[2]);
float *z = atoi(argv[3]);
float *psi = atoi(argv[4]);
float *v = atoi(argv[5]);
float u = atof(argv[6]);
float a = atof(argv[7]);
*x = 1;
*y = 2;
*z = 3;
*psi = 1.23;
*v = 3.21;
return 0;
}
但这似乎不起作用。
那么,如何从外部可执行文件中获取 多个 return 值?
您可以让其他进程将结果作为文本转储到标准输出或文件,然后解析该输出以获得结果。
您还可以使用更复杂的进程间通信方案,从内存映射文件(即 Sharing memory between two processes (C, Windows))到 TCP/IP 甚至完整的 HTTP 通信。
如果您确实需要外部进程来更新您的内存值,则其他进程必须有权写入您进程的内存并使用相应的方法更新另一个进程中的数据。您还需要非常小心地同步对此类数据的访问,因为您不知道外部进程何时存储数据。
在 Windows 上,您将使用 WriteProcessMemory C++ 之类的东西,并将原始进程的进程句柄作为参数传递给您启动的进程。请务必阅读执行此类操作所需的权限。
我有一个可执行程序 myApp
(或 Windows 中的 myApp.exe
)。我想在 C/C++ 程序中调用这个可执行文件,在 Qt 中使用 system("myApp")
或 QProcess:execute("myApp")
。
我想从 myApp
中获取多个 return 值,所以在调用这个可执行文件时,我传递了 pointers 作为参数,就像这样(在 Qt 中)
float *pStates = new float[nState];
float *pControl = new float[nControl];
pControl[0] = 0.1;
pControl[1] = 0.2;
QString proStr;
proStr = "myApp ";
for (int i = 0; i < nState; i++)
{
proStr += (QString::number((uint64_t)pStates + i * sizeof(float)) + " ");
}
for (int i = 0; i < nControl; i++)
{
proStr += (QString::number(pControl[i]) + " ");
}
QProcess::execute(proStr);
proStr
字符串可能看起来像
myApp 140483171852384 140483171852388 140483171852392 140483171852396 140483171852400 0.1 0.2
这里的140483xxx数是pStates
的指针或物理地址。
而 myApp
的代码看起来像
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 8)
{
return 1;
}
float *x = atoi(argv[1]);
float *y = atoi(argv[2]);
float *z = atoi(argv[3]);
float *psi = atoi(argv[4]);
float *v = atoi(argv[5]);
float u = atof(argv[6]);
float a = atof(argv[7]);
*x = 1;
*y = 2;
*z = 3;
*psi = 1.23;
*v = 3.21;
return 0;
}
但这似乎不起作用。
那么,如何从外部可执行文件中获取 多个 return 值?
您可以让其他进程将结果作为文本转储到标准输出或文件,然后解析该输出以获得结果。
您还可以使用更复杂的进程间通信方案,从内存映射文件(即 Sharing memory between two processes (C, Windows))到 TCP/IP 甚至完整的 HTTP 通信。
如果您确实需要外部进程来更新您的内存值,则其他进程必须有权写入您进程的内存并使用相应的方法更新另一个进程中的数据。您还需要非常小心地同步对此类数据的访问,因为您不知道外部进程何时存储数据。
在 Windows 上,您将使用 WriteProcessMemory C++ 之类的东西,并将原始进程的进程句柄作为参数传递给您启动的进程。请务必阅读执行此类操作所需的权限。