如何从程序创建/运行.exe? (C ++)

时间:2009-05-05 00:08:04

标签: c++ function parameters executable

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

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

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

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

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

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

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

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

现在我想创建另一个程序,它接受两个数字,然后添加它们,就像一个函数一样,除了一个单独的程序。

然后我想从第一个程序运行第二个程序,并从用户那里获得数字。即:

#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");

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

8 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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

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
}

答案 2 :(得分:1)

你的问题有点不清楚。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

}

答案 5 :(得分:0)

是的,singinanarchist正走在正确的轨道上。 C ++控制台应用程序以调用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" ;

您可以在其中执行您对输入参数的所需。

答案 6 :(得分:0)

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

caller.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);

callee.h:

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

callee.cpp:

#include "callee.h"

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

声明:

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

<强>参考文献:
LoadLibrary
GetProcAddress

答案 7 :(得分: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;
}