2011-07-23 14 views
5

Okej, załóżmy, że mam plik b.exe, który pobiera argument łańcuchowy. Chcę powołać b.exe ciągu a.cpp z systemu:jak przekazać zmienną argument do exe?

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

i jest to kod w b.cpp:

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

co chcę, kiedy uruchomić. exe, wyjście będzie:

s1 after invoke = hello world 

czy można to zrobić? zasadniczo, po prostu chcę przekazać zmienną do exe, ale musi być przez odniesienie, nie tylko przez wartość, ponieważ chcę, aby zmienna była przetwarzana i modyfikowana w exe, który wywołałem. Przeszukałem już rozwiązanie w Internecie, ale daje mi to tylko sposób przekazania zmiennej wartości przez wartość exe, a nie przez odniesienie ..

każda sugestia zostanie bardzo doceniona, ale jeśli to możliwe, chcę sugestię w postaci powyższego kodu korekcji i dołączyć pliki, jeśli takie istnieją. dzięki za pomoc :)

+0

Klasyczne pytanie na komunikację między procesami! Prostym rozwiązaniem jest udostępnienie pamięci między tymi dwoma procesami. Jeśli używasz Linuksa, wyszukaj 'mmap()' i zobacz przykładowe programy. :-) – Stan

Odpowiedz

3

Nie można modyfikować argumentów wiersza poleceń między różnymi procesami. s1 znany jest tylko z A.CPP, a s znany jest tylko B.CPP.

+0

Rozumiem ... to jest za złe wtedy .... dzięki za odpowiedź :) – zia

1

Nie, to niemożliwe. Ponadto, main nie przyjmuje łańcucha jako parametru.

Twój ciąg s1 znajduje się w przestrzeni adresowej procesu, który przechowuje a.cpp. Nie można przekazywać elementów przez odniesienie między procesami, co jest zadaniem, które należy wykonać, aby uzyskaćpodczas przekazywania s1 do pracy z uruchomionym programem b.exe. Oto, co się stanie, gdy naprawisz błędy składniowe: b.exe skopiuje zawartość ciągu, zapisując je we własnej przestrzeni adresowej.

Będziesz chciał przejrzeć komunikację między procesami, aby osiągnąć coś podobnego, ale nie ma prostego sposobu na zrobienie tego.

0

Nie można tego zrobić. Najlepsze, co możesz zrobić, to przekazać ciągi według wartości. I przez struny, naprawdę mam na myśli tablice char.

W rzeczywistości, oficjalny prototyp główny jest bardziej jak

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

Jeśli chcesz, aby program do kompilacji w C++, nie masz wielkiego wyboru

0

składni main(string) nie jest poprawna. W C++ main może mieć dwóch ważnych podpisów:

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

Gdzie argc zawiera liczbę argumentów przekazany do pliku wykonywalnego i argv punkty do tablicy tych argumentów.

Możesz przekazać kilka argumentów do b.exe i napisać swój program na podstawie tego. Aby uzyskać więcej informacji, możesz wyszukać sygnaturę main() i sposób jej użycia.

0

Prosty, ale oczywiście nie najładniejszym rozwiązaniem byłoby wykorzystanie tymczasowy plik:

Pseudo kod: wezwać) zrobić wszystko, co w punkcie a), że trzeba przed wywołaniem B). Od A), Wyprowadź zmienne do pliku tymczasowego. Od A), wywołanie B. Zaimportuj zmienne z pliku tymczasowego. Wyczyść ten plik. Czy wszystko, co trzeba zrobić w b) zmiennych wyjściowych od b) do tymczasowego pliku Wyjście B) zmiennych wejściowych z pliku tymczasowego do A) Czy standardowe wyjście opuścić)

W przeciwnym razie trzeba przejrzeć interfejs przekazywania komunikatów (MPI), który nie jest najłatwiejszym rozwiązaniem.

0

Nie można modyfikować zmiennej bezpośrednio między dwoma procesami, ale można zrobić coś podobnego, aby uzyskać ten sam efekt końcowy.

Najprostszym sposobem wykonania tej czynności może być użycie _popen(). Podstawowy pomysł jest następujący:

  • Aby przekazać ciąg znaków od A do B, można przekazać go jako parametr wiersza poleceń. B może odczytać to z tablicy argv [] w main().

  • Ale aby zwrócić informacje z powrotem do B, potrzebujesz innej techniki. _popen() używa wewnętrznie potoków i wykonuje wiele pracy konfiguracyjnych, więc A może użyć funkcji fgets() lub dowolnej innej funkcji FILE * do odczytywania danych wyjściowych z B. B może następnie wykonać printf ("Witaj świecie"); "zwraca" ciąg, a A może odczytać ten ciąg z PLIKU *, że _popen() zwraca.

Więcej informacji i przykład można znaleźć pod numerem MSDN page on _popen().

0

Hi guys Wiem, że to stary post, ale każdy trochę pomaga :)

Wysyłanie argument się z zewnątrz .exe za pomocą zmiennej można łatwo zrobić poprzez dołączenie zmienną string użyć do wywołania systemowego przy użyciu .c_str()

Po przeczytaniu pierwotnego pytania wydaje się, że facet chce pobrać zmienną z pliku .exe, co nie jest możliwe, ale do tego, czego szukałem, a ponieważ jest to pierwsze łącze Google, które jest zwracana i myślę, że wielu innych skorzysta z tego, więc ..

Przykład:

// zadeklarować kilka zmiennych

void runapp(); 

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

// skompilować swój ciąg do wywołania systemowego

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

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

// nazwać swoim.exe

system(loadexe.c_str()); 

// pełne źródło poniżej

#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()); 
} 

Pozdrowienia

Alphanu

Powiązane problemy