uso programa por pasar parametros linea length enviar ejecutar desde con como comandos argumentos c++ winapi createprocess

c++ - por - programa con parametros java



CreateProcess no pasa argumentos de lĂ­nea de comando (8)

La versión Unicode de esta función, CreateProcessW, puede modificar el contenido de esta cadena. Por lo tanto, este parámetro no puede ser un puntero a la memoria de solo lectura (como una variable const o una cadena literal). Si este parámetro es una cadena constante, la función puede causar una violación de acceso.

Por lo tanto, puede intentar usar LPTSTR cmdArgs = _tcsdup("[email protected]") .

Otro problema es: ¿cómo lee el objetivo los argumentos? usando argv [0] como nombre de la aplicación? Luego debes agregar el nombre de la aplicación como el primer parámetro también.

Hola, tengo el siguiente código pero no funciona como se esperaba, no puedo entender cuál es el problema.

Básicamente, estoy ejecutando un proceso (un proceso .NET) y pasando los argumentos de la línea de comandos, CreateProcess () lo ejecuta con éxito, pero CreateProcess () no pasa los argumentos de la línea de comando

¿¿Qué estoy haciendo mal aquí??

int main(int argc, char* argv[]) { PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter STARTUPINFO StartupInfo; //This is an [in] parameter ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field LPTSTR cmdArgs = "[email protected]"; if(CreateProcess("D://email//smtp.exe", cmdArgs, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo)) { WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); printf("Yohoo!"); } else { printf("The process could not be started..."); } return 0; }

EDIT: Oye una cosa más, si paso mis cmdArgs así:

// a space as the first character LPTSTR cmdArgs = " [email protected]";

Luego aparece el error, luego CreateProcess devuelve TRUE pero mi proceso objetivo no se ejecuta.

Object reference not set to an instance of an object


A continuación se muestra una versión reducida del código utilizado por Zeus IDE para ejecutar procesos externos:

bool createProcess(const char *pszTitle, const char *pszCommand) { STARTUPINFO StartInfo; memset(&StartInfo, 0, sizeof(StartInfo)); StartInfo.cb = sizeof(StartInfo); StartInfo.lpTitle = (pszTitle) ? (char *)pszTitle : (char *)pszCommand; StartInfo.wShowWindow = SW_NORMAL; StartInfo.dwFlags |= STARTF_USESHOWWINDOW; if (CreateProcess(0, (char *)pszCommand, 0, 0, TRUE, CREATE_NEW_PROCESS_GROUP, 0, 0, &StartInfo, &ProcessInfo)) { lErrorCode = 0; } else { lErrorCode = GetLastError(); } return (lErrorCode == 0); }

El pszCommand sería la ruta ejecutable completa y el nombre y los argumentos del archivo, por ejemplo:

pszCommand = "D://email//smtp.exe [email protected]";

Por lo que puedo decir, la única diferencia real entre los dos es que en el ejemplo de Zeus , el argumento dwCreationFlags se establece en el valor CREATE_NEW_PROCESS_GROUP .


No está asignando memoria para su cadena.

En lugar de:

LPTSTR cmdArgs = "[email protected]";

tratar:

TCHAR cmdArgs[] = "[email protected]";

Editar: luego llamar:

CreateProcess("D://email//smtp.exe", &cmdArgs[0], ...

Esto creará una matriz local en la pila y luego pasará un puntero a esa matriz.


No parece que esté utilizando CreateProcess correctamente, consulte http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx .

  • La línea de comando a ser ejecutada. La longitud máxima de esta cadena es 32.768 caracteres, incluido el carácter nulo de terminación Unicode. Si lpApplicationName es NULL, la porción del nombre del módulo de lpCommandLine está limitada a MAX_PATH caracteres.

  • El parámetro lpCommandLine puede ser NULL. En ese caso, la función usa la cadena apuntada por lpApplicationName como la línea de comando.

  • Si lpApplicationName y lpCommandLine no son NULL, la cadena terminada en nulo apuntada por lpApplicationName especifica el módulo a ejecutar, y la cadena terminada en nulo apuntada por lpCommandLine especifica la línea de comando . El nuevo proceso puede usar GetCommandLine para recuperar toda la línea de comando. Los procesos de consola escritos en C pueden usar los argumentos argc y argv para analizar la línea de comando. Como argv [0] es el nombre del módulo, los programadores C generalmente repiten el nombre del módulo como el primer token en la línea de comando.

Entonces, en su caso, necesita esto como el argumento de comando y probablemente debería pasar un NULL para el primer parámetro para obtener el comportamiento que desea.

// NOTE THE Null-Terminated string too! LPTSTR cmdArgs = "D://email//smtp.exe [email protected]/0";


Prueba esto:

LPTSTR cmdArgs = "[email protected]"; CString szcmdline("D://email//smtp.exe"); szcmdline += _T(" ") + cmdArgs ; //Leave first param empty and pass path + argms in if(CreateProcess(NULL, szcmdline, second


Puede agregar un espacio como primer carácter de la cadena cmdArgs:

LPTSTR cmdArgs = " [email protected]";

Aparentemente, Windows agrega la cadena del segundo argumento al nombre de la aplicación representado por el primer argumento, y el resultado se pasa como argumentos de línea de comando al ejecutable. Entonces, al agregar un espacio, se separarán los argumentos.


Si el primer parámetro para CreateProcess() no es NULL, lo usará para ubicar la imagen para iniciar.

Si es NULL, analizará el segundo argumento para intentar que el ejecutable se inicie desde el primer token.

En cualquier caso, el tiempo de ejecución de C usará el segundo argumento para poblar la matriz argv . Entonces, el primer token de ese parámetro aparece en argv[0] .

Probablemente desee algo como lo siguiente (he cambiado el programa smtp.exe a echoargs.exe, una sencilla utilidad que tengo que ayudar a resolver este tipo de problema):

int main(int argc, char* argv[]) { PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter STARTUPINFO StartupInfo; //This is an [in] parameter char cmdArgs[] = "echoargs.exe [email protected]"; ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field if(CreateProcess("C://util//echoargs.exe", cmdArgs, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo)) { WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); printf("Yohoo!"); } else { printf("The process could not be started..."); } return 0; }

Aquí está la salida que obtengo de ese programa:

echoargs.exe [email protected] [0]: echoargs.exe [1]: [email protected] Yohoo!


También debe especificar el nombre del módulo en los parámetros: LPTSTR cmdArgs = "App [email protected]"; Debería ser toda la línea de comando (incluyendo argv [0]).