【问题标题】:How to call an external program and get multiple return values in C/C++?如何在 C/C++ 中调用外部程序并获取多个返回值?
【发布时间】:2017-08-30 10:58:48
【问题描述】:

我有一个可执行程序myApp(或Windows 中的myApp.exe)。我想在 C/C++ 程序中调用这个可执行文件,在 Qt 中使用 system("myApp")QProcess:execute("myApp")

我想从myApp 获得多个返回值,所以在调用这个可执行文件时,我将 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;
}

但这似乎不起作用。

那么,我怎样才能从外部可执行文件中获得多个返回值?

【问题讨论】:

  • 您可以让其他程序将其输出写入标准输出,然后您使用popen调用它
  • 每个进程都有自己的虚拟地址空间。将地址传递给不同的进程是没有意义的。

标签: c++ c pointers arguments return-value


【解决方案1】:

您可以让其他进程将结果作为文本转储到标准输出或文件中,然后解析该输出以获得结果。

您还可以使用更复杂的进程间通信方案,范围从内存映射文件(即Sharing memory between two processes (C, Windows))到 TCP/IP 甚至完整的 HTTP 通信。

如果您确实需要外部进程来更新您的内存值,则其他进程必须有权写入您的进程的内存并使用相应的方法来更新另一个进程中的数据。您还需要非常小心地同步对此类数据的访问,因为您不知道外部进程何时存储数据。

在 Windows 上,您可以使用 WriteProcessMemory C++ 之类的东西并将原始进程的进程句柄作为参数传递给您启动的进程。请务必阅读执行此类操作所需的权限。

【讨论】:

  • 文件方法很好而且通用。如果“myApp”在 OP 的控制下(大概是这样),命令行上的参数之一可能是要写入的文件的名称。
猜你喜欢
  • 2015-06-30
  • 2016-09-17
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
相关资源
最近更新 更多