Как создать / запустить .exe из программы? (C ++) - PullRequest
0 голосов
/ 05 мая 2009

Возможно ли (и если да, то как) написать программу на 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 ]

4 голосов
/ 05 мая 2009

Я не совсем уверен, что вы хотите сделать, но вы можете запускать приложения в Windows несколькими способами. Наиболее распространенный способ «окон» это сделать:

  • Используйте ShellExecute для запуска программы в Windows.
  • Если вам нужно вернуть возвращаемое значение, вы можете использовать CreateProcess .

Звучит так, будто вы хотите взять значения argc и argv из исходного приложения, а затем использовать эти значения в качестве параметров в вышеуказанных функциях для запуска вашего второго приложения.

Вы можете связываться между процессами несколькими способами, используя каналы, сокеты, файлы или даже код возврата 2-й программы.

Возможно, вам лучше создать DLL для загрузки из вашего первого приложения. DLL будет делать все, что вы хотите, и может возвращать значения вам напрямую без дополнительного уровня связи.

2 голосов
/ 05 мая 2009

В большинстве операционных систем вы можете передавать аргументы в 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
}
1 голос
/ 05 мая 2009

Ваш вопрос немного неясен.

Вы случайно не ищете что-то вроде системного вызова? http://en.wikipedia.org/wiki/System_(C_standard_library)

С system вы можете вызвать любой исполняемый файл и передать в него любое количество аргументов командной строки.

0 голосов
/ 14 марта 2017

Несколько вещей по адресу:

1) Никогда не используйте систему (). Это зло (не зависит от платформы, ошибка безопасности и т. Д.). system () предполагает, что на целевом компьютере есть интерпретатор команд, которого у него может не быть!

2) Если вы хотите использовать систему, сделайте это (при условии, что у вас есть вектор аргументов с именем args, вызываемый процесс находится в строке с именем proc)

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

Вы можете скомпилировать, предполагая, что на целевом ПК есть компилятор (еще раз, небезопасный), и вызывая его (например, 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;
}
0 голосов
/ 05 мая 2009

Это решение для Windows, но вы можете вызвать функцию, определенную в другом исполняемом файле. Обычно это задача DLL, но в любом случае EXE и DLL имеют одинаковый формат (есть несколько разных флагов, но оба они в формате Portable Executable (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

0 голосов
/ 05 мая 2009

Да, единый анархист был на правильном пути. Консольное приложение 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" ;

В котором вы можете выполнять то, что вы хотели бы с входными аргументами.

0 голосов
/ 05 мая 2009

Не уверен, что я понимаю вопрос, но вы можете добавить параметры в программу C / C ++, используя:

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

}
0 голосов
/ 05 мая 2009

Да, есть несколько способов, таких как розетки, трубы, RPC ... http://en.wikipedia.org/wiki/Inter-process_communication

...