как передать аргумент переменной в exe? - PullRequest
5 голосов
/ 23 июля 2011

Хорошо, допустим, у меня есть b.exe, который принимает строковый аргумент.Я хочу вызвать b.exe в a.cpp, с системой:

    string s1 = "hallo";
    system("b.exe s1");
    printf("s1 after invoke = %s",s1);

, и это код в b.cpp:

    int main(string s)
    {
         s = "hello world";
         return 0; 
    }

, что я хочу, когда язапустите a.exe, результат будет:

    s1 after invoke = hello world

возможно ли это сделать?в основном, я просто хочу передать переменную в exe, но это должно быть по ссылке, а не только по значению, потому что я хочу, чтобы эта переменная была обработана и изменена в exe, который я вызвал.Я уже искал решение в интернете, но оно предоставляет мне только способ передать переменную по значению в exe, а не по ссылке.

Любое предложение будет очень полезно, но если возможно,Я хочу предложение в виде вышеуказанного кода исправления и включить файлы, если таковые имеются.спасибо за вашу помощь :)

Ответы [ 7 ]

3 голосов
/ 23 июля 2011

Невозможно изменить аргументы командной строки среди разных процессов. s1 известен только A.CPP, а s известен только B.CPP.

1 голос
/ 26 августа 2013

Привет, ребята, я знаю, что это старый пост, но каждый немного помогает:)

Отправка аргумента во внешне вызванный .exe с помощью переменной может быть легко сделана путем добавления строковой переменной для использования в системе.вызов с использованием .c_str ()

После прочтения исходного вопроса кажется, что парень хочет взять переменную из .exe, что невозможно, но то, что я искал, и так как это первыйСсылка Google возвращается, и я думаю, что многие другие выиграют от этого, поэтому ..

Пример:

// объявляем некоторые переменные

void runapp();

string ip;
string img;
string tri = "notepad.exe";
string loadexe;
string space =  " "; //Just a simple ascii space used between arguments

// компилируем вашу строкудля системного вызова

    ip = argv[1];
    img = argv[2];

    loadexe = tri + space + ip + space + img; // compiled string to use for system call

// позвоните .exe

system(loadexe.c_str());

// полный источник ниже

#include<iostream>
#include<stdio.h>
#include<string>

using namespace std;

void runapp();

string ip;
string img;
string tri = "notepad.exe"; // your .exe to load
string loadexe;
string space =  " "; //Just a simple ascii space used between arguments

void main(int argc , char *argv[])
{   
    ip = argv[1];
    img = argv[2];

    loadexe = tri + space + ip + space + img;

    }else{
        //bla bla bla
}

void runapp()
{
    system(loadexe.c_str());
}

С уважением

Alphanu

1 голос
/ 23 июля 2011

Нет, это невозможно. Кроме того, main не принимает строку в качестве параметра.

ваша строка s1 находится в адресном пространстве процесса, который содержит a.cpp. Нельзя передавать элементы по ссылке между процессами, чего вы пытаетесь достичь, передавая s1 процессу, выполняющему b.exe. Вот что произойдет, когда вы исправите синтаксические ошибки: b.exe копирует содержимое строки, сохраняя его в собственном адресном пространстве.

Вы захотите изучить межпроцессное взаимодействие, чтобы достичь чего-то похожего, но простого способа сделать это не существует.

0 голосов
/ 28 июля 2011

Невозможно изменить переменную напрямую между двумя процессами, но вы можете сделать что-то подобное, чтобы получить тот же конечный результат.

Простейшим способом сделать это может быть использование _popen () . Основная идея такова:

  • Чтобы передать строковый аргумент от A до B, вы можете передать его в качестве параметра командной строки. B может прочитать это из массива argv [] в main ().

  • Но чтобы вернуть информацию обратно в B, вам понадобится другая техника. _popen () использует каналы внутренне и выполняет большую часть работы по его настройке, поэтому A может затем использовать fgets () или любую другую функцию на основе FILE * для чтения вывода обратно из B. B может затем выполнить printf ( "Привет, мир"); «вернуть» строку, и А может прочитать эту строку из ФАЙЛА *, который возвращает _popen ().

См. Страницу MSDN в _popen () для получения дополнительной информации и примера.

0 голосов
/ 23 июля 2011

Простым, но, конечно, не самым привлекательным решением будет использование временного файла:

Псевдокод: Звоните А) Сделайте все в А), что вам нужно, прежде чем позвонить Б). От A) Вывод переменных во временный файл. Из А) звони Б. Импортировать переменные из временного файла. Очистите этот файл. Делай все что нужно в Б) Выходные переменные из B) во временный файл Выход Б) Входные переменные из временного файла в A) Делать стандартный вывод Выход А)

В противном случае вам нужно обратиться к интерфейсу передачи сообщений (M.P.I.), который не совсем простое решение.

0 голосов
/ 23 июля 2011

Ваш синтаксис main(string) неверен. В C ++ main может быть две действительные подписи:

int main ();
int main (int argc, char **argv);

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

Вы можете передать несколько аргументов b.exe и написать свою программу на основе этого. Для получения дополнительной информации вы можете найти подпись main() и как она используется.

0 голосов
/ 23 июля 2011

Это невозможно сделать. Лучшее, что вы можете сделать, это передать строки по значению. И под строками я действительно подразумеваю массивы символов.

На самом деле официальный прототип для main больше похож на

int main(int argc, char** argv);

Если вы хотите, чтобы ваша программа компилировалась в C ++, у вас нет особого выбора

...