2011-07-23 39 views
5

Bien, digamos que tengo b.exe, que toma un argumento de cadena. Quiero invocar b.exe dentro a.cpp, con el sistema:cómo pasar el argumento variable a exe?

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

y este es el código en b.cpp:

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

lo que quiero es, cuando corro a. exe, la salida será:

s1 after invoke = hello world 

¿es posible hacer eso? básicamente, solo quiero pasar una variable a un exe, pero debe ser por referencia, no solo por valor porque quiero que esa variable se procese y modifique dentro del exe que invoqué. Ya he buscado la solución en Internet, pero solo me proporciona la forma de pasar una variable por valor al exe, no por referencia ...

cualquier sugerencia será muy apreciada, pero si es posible, quiero la sugerencia en la forma del código de corrección anterior e incluir archivos, si los hay. gracias por su ayuda :)

+0

Una pregunta clásica de la comunicación entre procesos! Una solución simple es compartir memoria entre los dos procesos. Si está utilizando Linux, busque 'mmap()' y vea programas de ejemplo. :-) – Stan

Respuesta

3

No es posible modificar los argumentos de la línea de comandos entre los diferentes procesos. s1 es conocido solo por A.CPP, y solo se conoce por B.CPP s.

+0

Ya veo ... eso es muy malo, entonces ... gracias por la respuesta :) – zia

1

No, eso no es posible. Además, main no acepta cadena como parámetro.

su cadena s1 se encuentra en el espacio de direcciones del proceso que contiene a.cpp. No puede pasar elementos por referencia entre procesos, que es lo que está intentando cuando pasa s1 para procesar b.exe en ejecución. Esto es lo que sucederá cuando corrija los errores de sintaxis: b.exe copia el contenido de la cadena, guardándolos en su propio espacio de direcciones.

Querrá ver la comunicación entre procesos para lograr algo similar, pero no hay una manera fácil de hacerlo.

0

No es posible hacer eso. Lo mejor que puedes hacer es pasar cadenas por valor. Y por cadenas, realmente me refiero a las matrices de caracteres.

De hecho, el prototipo oficial principal se parece más a

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

Si desea que su programa para compilar en C++, que no tienen mucha elección

0

Su sintaxis main(string) no es correcto. En C++ main puede tener dos firmas válidas:

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

Dónde argc contiene el número de argumento pasado al ejecutable y argv puntos en la matriz de estos argumentos.

Puede pasar varios argumentos al b.exe y escribir su programa en función de eso. Para obtener más información, puede buscar la firma main() y cómo se usa.

0

A, pero por supuesto, no es la solución más bonita sencilla, sería utilizar un archivo temporal:

Pseudo código: Llamada A) hacer todo en A) que necesita antes de llamar a B). desde A), variables de salida a un archivo temporal. Desde A), llame a B. Importe variables del archivo temporal. Borrar este archivo hacer todo lo que tiene que hacer en B) Variables de salida de B) a archivo temporal salida B) Las variables de entrada de archivo temporal a A) hacer estándar de salida de salida A)

lo contrario necesitarás para ver la Interfaz de paso de mensajes (MPI), que no es exactamente la solución más fácil.

0

No es posible modificar una variable directamente entre dos procesos, pero puede hacer algo similar para obtener el mismo resultado final.

La forma más simple de hacer esto podría ser usar _popen(). La idea básica es la siguiente:

  • Para pasar un argumento de cadena de A a B, puede pasarlo como un parámetro de línea de comando. B puede leer esto de la matriz argv [] en main().

  • Pero para devolver la información a B, necesita alguna otra técnica. _popen() usa las canalizaciones internamente, y hace gran parte del trabajo de configurarlo para usted, por lo que A puede usar fgets() o cualquier otra función basada en FILE * para leer la salida de B. B puede hacer printf ("Hola Mundo"); para 'devolver' la cadena, y A puede leer esa cadena desde el ARCHIVO * que devuelve _popen().

Consulte el MSDN page on _popen() para obtener más detalles y un ejemplo.

0

Hola chicos saben que esto es una entrada antigua, pero cada pequeña ayuda :)

El envío de un argumento para una llamada externa .exe utilizando una variable se puede hacer fácilmente añadiendo una variable de cadena que se utilizará para la llamada al sistema usando .c_str()

Después de leer la pregunta original, parece que el chico quiere tomar una variable dentro de un .exe que no es posible pero para lo que estaba buscando y ya que este es el primer enlace de Google que se devuelve y creo que muchos otros se beneficiarán de esto así que ...

Ejemplo:

// declaran algunas variables

void runapp(); 

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

// compilar su cadena para la llamada al sistema

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

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

// llamar al.exe

system(loadexe.c_str()); 

// completa fuente de abajo

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

Saludos

Alphanu

Cuestiones relacionadas