2012-05-25 13 views
6

Quali sono le principali differenze tra i due? Sono disposto a eseguire solo un altro EXE dalla mia applicazione (C++). Ci sono delle differenze quando si ereditano gli ambienti, le caratteristiche di sicurezza, ecc.?CreateProcess e ShellExecute differenze

+1

La [documentazione MSDN] (http://msdn.microsoft.com) vi danno queste informazioni. Questa domanda è completamente troppo vaga e non specifica per SO. Ci sono dozzine di domande che ne discutono entrambe e non hai mostrato assolutamente nessuno sforzo per cercare da soli. (Come un suggerimento: solo consente di specificare nulla circa l'ambiente, ereditando le maniglie, e altre informazioni lascio alle vostre abilità di ricerca per capire che uno..) –

risposta

11

La differenza principale tra CreateProcess e ShellExecute è il seguente: CreateProcess è più orientato a basso livello e ShellExec sulla leva alta utente che vede l'utente in esploratore.

Ad esempio l'utilizzo di CreateProcess si può utilizzare la riga di comando la cui lunghezza è più come MAX_PATH. Ha una restrizione di 32.768 caratteri. È inoltre possibile utilizzare CreateProcess per avviare il programma (se si dispone di autorizzazioni sufficienti) su un altro desktop di Windows come nella schermata di accesso.

altro esempio. È possibile utilizzare ShellExecute per avviare il Pannello di controllo o aprire qualsiasi programma esistente sul computer per la modifica di file JPG, ad esempio. Quindi lavori con ShellExecute vicino alle azioni corrispondenti in Windows Explorer.

+0

CreateProcess non può iniziare un processo se il percorso il programma ha superato MAX_PATH. Può passare lunghi argomenti a un programma che può essere avviato, ma è diverso. In sostanza non c'è modo al momento di avviare un programma che si trova più profondo di MAX_PATH (a meno che non v'è un breve 8.3 equivalente) – nikos

+0

@nikos: Si può utilizzare sia '' lpApplicationName' e lpCommandLine' per specificare il programma con i parametri. La lunghezza massima di 'lpCommandLine' è limitata a 32.768 caratteri. È possibile leggere [la documentazione] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx) che "Se lpApplicationName è NULL, il nome del modulo porzione di lpCommandLine è limitata ai caratteri MAX_PATH. ". Usando sia 'NpApplicationName' non NULL' e' lpCommandLine' si dovrebbe essere in grado di specificare la parte del modulo la cui lunghezza è maggiore di MAX_PATH. Penso che si dovrebbe usare il prefisso "\\? \" Nel percorso – Oleg

+0

@nikos: Inoltre, a partire da Windows 10, versione 1607, le limitazioni MAX_PATH sono state rimosse dal comune file Win32 e dalle funzioni di directory (si veda [l'annuncio iniziale] (https : //mspoweruser.com/ntfs-260-character-windows-10/) e [la documentazione] (https: // msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath)). – Oleg

4

La principale differenza è in termini di flessibilità. ShellExecute è più facile da usare, ma non ha molta flessibilità. CreateProcess è un problema da usare, ma ti consente di fare qualsiasi cosa.

Ad esempio, con CreateProcess, è possibile specificare handle (pipe o file) da utilizzare per i flussi di input/output/errore standard nel child. ShellExecute non ti dà il modo di farlo.

E 'probabilmente anche la pena notare che, anche se ShellExecutepuò essere utilizzato per avviare direttamente un eseguibile, il suo intento primario è quello di "eseguire" i file di documenti - per esempio, dire a "eseguire" una "whatever.html" e avvia il browser Web predefinito e carica il file HTML specificato. È possibile farlo usando CreateProcess pure, ma per farlo, è (normalmente) avviare chiamando FindExecutable di trovare il programma associato con il file di dati in questione, quindi eseguire che passa il file di dati come parametro.

2

CreateProcess restituisce il manico e l'ID per il processo avviato ed è filo conduttore nella struttura PROCESS_INFORMATION