2012-05-25 40 views
6

¿Cuáles son las principales diferencias entre los dos? Estoy dispuesto a ejecutar solo otro EXE desde mi aplicación (C++). ¿Hay alguna diferencia al heredar entornos, características de seguridad, etc.?CreateProcess y ShellExecute diferencias

+1

El [docs MSDN] (http://msdn.microsoft.com) le dan esta información. Esta pregunta es demasiado vaga y no específica para SO. Hay docenas de preguntas que discuten ambas, y usted no ha demostrado absolutamente ningún esfuerzo para investigar esto usted mismo. (Como una pista: solo uno le permite especificar cualquier cosa sobre el entorno, heredando identificadores y otra información. Dejo a su capacidad de investigación averiguar cuál) –

Respuesta

11

La principal diferencia entre CreateProcess y ShellExecute es la siguiente: CreateProcess está más orientado en nivel bajo y ShellExec en la palanca de alta usuario que ver el usuario en el explorador.

Por ejemplo usando de CreateProcess uno puede usar la línea de comando cuya longitud es más como MAX_PATH. Tiene una restricción de 32,768 caracteres. También puede usar CreateProcess para iniciar el programa (si tiene suficientes permisos) en otro escritorio de Windows como en la pantalla de inicio de sesión.

Otro ejemplo. Puede usar ShellExecute para iniciar el Panel de control o abrir cualquier programa que exista en la computadora para editar JPG archivado, por ejemplo. Entonces usted trabaja con ShellExecute cerca de las acciones correspondientes en el Explorador de Windows.

+0

CreateProcess NO puede iniciar un proceso si el camino a el programa tiene más de MAX_PATH. Puede pasar largos argumentos a un programa que se puede iniciar, pero eso es diferente. Básicamente no hay forma en el presente de iniciar un programa que se encuentra más allá de MAX_PATH (a menos que haya un corto 8.3 equivalente) – nikos

+0

@nikos: Se puede usar tanto 'lpApplicationName' como' lpCommandLine' para especificar el programa con parámetros. La longitud máxima de 'lpCommandLine' está limitada a 32.768 caracteres. Puede leer en [la documentación] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx) que "Si lpApplicationName es NULL, el nombre del módulo La porción de lpCommandLine está limitada a MAX_PATH caracteres ". Al usar tanto NULL 'lpApplicationName' como' lpCommandLine' uno debería poder especificar la parte del módulo cuya longitud es mayor como MAX_PATH. Creo que uno debería usar el prefijo "\\? \" En la ruta – Oleg

+0

@nikos: Además, a partir de Windows 10, versión 1607, las limitaciones MAX_PATH se han eliminado de las funciones comunes de archivos y directorios de Win32 (ver [el anuncio inicial] (https : //mspoweruser.com/ntfs-260-character-windows-10/) y [la documentación] (https: // msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath)). – Oleg

4

La principal diferencia está en la flexibilidad. ShellExecute es más fácil de usar, pero no tiene mucha flexibilidad. CreateProcess es difícil de usar, pero le permite hacer cualquier cosa.

Solo por ejemplo, con CreateProcess, puede especificar identificadores (conductos o archivos) para utilizar para las secuencias de entrada/salida/error estándar en el elemento secundario. ShellExecute no le da ganas de hacer eso.

Es probable que también vale la pena señalar que aunque ShellExecute puede usarse para iniciar un ejecutable directamente, su intención principal es "ejecutar" archivos de documentos - por ejemplo, dilo a "ejecutar" a "whatever.html" , y enciende su navegador web predeterminado y carga el archivo HTML especificado en él. También puede hacerlo usando CreateProcess, pero para hacerlo, (normalmente) comienza por llamar al FindExecutable para encontrar el programa asociado con el archivo de datos en cuestión, y luego ejecutarlo pasando su archivo de datos como parámetro.

2

CreateProcess devuelve el identificador y la identificación para el proceso iniciado y es el hilo principal de la estructura PROCESS_INFORMATION