0

是否可以(如果可以,如何)用 C++ 编写一个带有参数的程序,然后从另一个 C++ 程序运行该程序。

即:我可以创建一个添加两个数字的函数:

int add(int a,int b){return a+b;}

是否可以做同样的事情,除了一个单独的 C++ .exe 而不是一个函数?

编辑:由于很多人不理解我的问题,我会尽量准确地说出我想知道该怎么做。

我想要一个程序,我们称之为“p1”。

我希望该程序从用户那里获得两个数字:

int x,y;
cin>>x;
cin>>y;

现在我想创建另一个程序,它需要两个数字并将它们相加,就像一个函数一样,除了一个单独的程序。

然后我想用从用户那里得到的数字从第一个程序运行第二个程序。IE:

#include<iostream>
using namespace std;
int main()
{
     int x,y;
     cin>>x;
     cin>>y;
     add(x,y); //this is how I would call a function named "add".  I want to know how to do that with a separate program instead of just a separate function.
     return 0;
}

编辑:我想出了如何使用

(void)system("C:\\Program Files\\test.exe");

我将如何使用它来传递参数,以及如何编写一个接受这些参数的程序?

4

8 回答 8

4

我不确定你想做什么,但你可以通过多种方式在 Windows 中启动应用程序。最常见的“windows”方式是:

听起来您想从源应用程序中获取 argc 和 argv 值,然后将这些值用作上述函数的参数来启动您的第二个应用程序。

您可以通过使用管道、套接字、文件甚至第二个程序的返回码以多种方式在进程之间进行通信。

您最好创建一个 DLL 以从您的第一个应用程序加载。DLL 可以做任何你想做的事情,并且可以直接将值返回给你,而无需额外的通信层。

于 2009-05-05T00:17:01.707 回答
2

在大多数操作系统上,您可以在 system() 中通过空格分隔参数来传递参数:

system("someapp.exe 42 24");

当然,这个字符串可以由 sprintf 或 std::ostringstream 或你有的东西建立。

然后你只需要在另一个程序中处理你的参数:

int main(int argc, char **argv) {
  // important - make sure we have enough args
  if (argc != 3) { // first (zeroth) argument is always the program name, so 1+2 args is needed
    fprintf(stderr, "Wrong number of arguments\n");
    return EXIT_FAILURE;
  }
  int a = atoi(argv[1]);
  int b = atoi(argv[2]);
  // do stuff
}
于 2009-05-05T02:12:07.983 回答
1

你的问题有点不清楚。

您是否有机会寻找类似系统调用的东西?http://en.wikipedia.org/wiki/System_(C_standard_library)

使用system您可以调用任何可执行文件并将任意数量的命令行参数传递给该可执行文件。

于 2009-05-05T00:10:36.200 回答
0

是的,有几种方法,如套接字、管道、rpc ... http://en.wikipedia.org/wiki/Inter-process_communication

于 2009-05-05T00:14:05.693 回答
0

不确定我是否理解这个问题,但您可以使用以下命令向 C/C++ 程序添加参数:

int main (int argc, char *argv[])
{
   if (argc == 1)

}
于 2009-05-05T00:17:17.090 回答
0

是的,singinanarchist 是在正确的轨道上。C++ 控制台应用程序以 call 开头main( int argc, char* argv[] ),它接受两个参数:

  • argc= 参数计数:输入参数的数量
  • argv= 参数向量:char*参数数组

因此,如果您将程序编译为prog.exe,并希望将其运行为

prog 12 23

然后argc是 3,参数向量argv等价于

argv[0] = "prog" ; // (or "prog.exe")
argv[1] = "12" ;
argv[2] = "23" ;

您可以在其中对输入参数执行您想要的操作。

于 2009-05-05T00:42:52.753 回答
0

这是一个特定于 Windows 的解决方案,但您可能能够调用在另一个可执行文件中定义的函数。这通常是 DLL 的任务,但 EXE 和 DLL 无论如何都是相同的格式(有一些不同的标志,但它们都是可移植可执行文件 (PE) 格式),所以它应该可以工作。你必须做这样的事情:

调用者.cpp:

#include <windows.h>

// [...]

HMODULE moduleHandle = LoadLibrary("callee.exe"); // or .dll
int(*add)(int, int) = (int(*)(int, int))GetProcAddress(moduleHandle, "add");
int result = add(1, 1);

被调用者.h:

// Not sure if dllexport will work for EXEs
__declspec(dllexport) int add(int a, int b);

被调用者.cpp:

#include "callee.h"

int add(int a, int b) { return a + b; }

免责声明:

  • 未经测试(语法和逻辑)
  • 没有错误检查/资源释放

参考:
LoadLibrary
GetProcAddress

于 2009-05-05T02:24:37.767 回答
0

有几点需要解决:

1) 永远不要使用 system()。这是邪恶的(不是独立于平台的,安全漏洞等)。system() 假设目标计算机有一个命令解释器,它可能没有!

2)如果你想使用系统,这样做(假设你有一个称为args的参数向量,要调用的进程在一个名为proc的字符串中)

string final = proc;
final += " ";
for (int j = 0; j < args.size(); j++) {
  final += args[j];
  final += " ";    
}
system(final.c_str());

您可以通过假设目标 PC 有一个编译器(再次强调,不安全)并调用它(例如 g++ source.cpp)来进行编译。

3)使用管道。代码示例:

inline std::string exec_proc(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
    if (!pipe) cout << "Launch failed, possible permission error" << endl;
    while (!feof(pipe.get())) {
        if (fgets(buffer.data(), 128, pipe.get()) != NULL)
            result += buffer.data();
    }
    return result;
}
于 2017-03-14T18:42:05.367 回答