2013-03-15 12 views
19

Quello che voglio fare è aprire un .exe da un altro .exe. Non so davvero come farlo, quindi ho cercato su Internet. Ho provato alcuni metodi suggeriti da internet, ma non ha funzionato.Come posso aprire un file .exe da un altro C++ .exe?

Ecco il mio codice:

#include <iostream> 
#include <windows.h> 
using namespace std; 

int main() 
{ 
    system ("OpenFile.exe"); 
    system ("pause"); 
    return 0; 
} 

Quando eseguo in DEV C++, non compilare ed ottengo un errore. Qualcuno può aiutarmi?

+2

Qual è l'errore? In ogni caso, su un sospetto, [man system] (http://linux.die.net/man/3/system) - prova '#include ' – RageD

+8

Puoi provare 'fopen()'. Aprirà il tuo .exe. –

+0

RageD, grazie per averlo compilato ma il programma non sta ancora aprendo openfile.exe –

risposta

45

si dovrebbe sempre evitare di utilizzare system() perché

  • E 'risorsa pesante
  • Sconfigge la sicurezza - non si sa che si tratta di un comando valido o fa la stessa cosa su ogni sistema, si potrebbe persino avviare programmi che non intendevi avviare. Il pericolo è che quando si esegue direttamente un programma, si ottengono gli stessi privilegi del programma: ciò significa che se, ad esempio, si esegue come amministratore di sistema, il programma dannoso eseguito inavvertitamente viene eseguito anche come amministratore di sistema . Se ciò non ti spaventa sciocco, controlla il tuo polso.
  • I programmi anti virus lo odiano, il tuo programma potrebbe essere contrassegnato come un virus.

È necessario utilizzare CreateProcess().

È possibile utilizzare Createprocess() per avviare solo un file .exe e creare un nuovo processo per esso. L'applicazione verrà eseguita indipendentemente dall'applicazione chiamante.

Ecco un esempio che ho usato in uno dei miei progetti:

#include <windows.h> 

VOID startup(LPCTSTR lpApplicationName) 
{ 
    // additional information 
    STARTUPINFO si;  
    PROCESS_INFORMATION pi; 

    // set the size of the structures 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    // start the program up 
    CreateProcess(lpApplicationName, // the path 
    argv[1],  // Command line 
    NULL,   // Process handle not inheritable 
    NULL,   // Thread handle not inheritable 
    FALSE,   // Set handle inheritance to FALSE 
    0,    // No creation flags 
    NULL,   // Use parent's environment block 
    NULL,   // Use parent's starting directory 
    &si,   // Pointer to STARTUPINFO structure 
    &pi    // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) 
    ); 
    // Close process and thread handles. 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 

EDIT: L'errore che si sta ottenendo è perché è necessario specificare il percorso del file exe non solo il nome. Openfile.exe probabilmente non esiste.

+1

Ho incluso il file di intestazione 'windows.h' per completare il codice – SAAD

+0

C'è un buon esempio in https: //msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx (alla fine del link in questa risposta, ma facile da perdere). E un piccolo consiglio, se qualcuno usa 'lpApplicationName' con un percorso exe che include spazi, dovrebbe ** non ** essere circondato con' "', solo se sia exe che riga di comando è in argv [1]. – 244an

+1

Penso che sia necessario modificare la funzione da void a bool e restituire true/false in base al successo di CreateProcess() –

10

Ho avuto un grande successo con questo:

#include <iostream> 
#include <windows.h> 

int main() { 
    ShellExecute(NULL, "open", "path\\to\\file.exe", NULL, NULL, SW_SHOWDEFAULT); 
} 

Se siete interessati, la documentazione completa è qui:

http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx.

+0

CreateProcess() è migliore di ShellExecute() –

0

Si sta ottenendo questo errore perché non si sta dando il percorso completo. (C: \ Users ... \ file.exe) Se si desidera rimuovere questo errore, fornire il percorso completo o copiare l'applicazione (che si desidera aprire) nella cartella in cui è presente/salvato il progetto (.exe) .

#include <windows.h> 
using namespace std; 
int main() 
{ 
    system ("start C:\\Users\\Folder\\chrome.exe https://www.stackoverflow.com"); //for opening stackoverflow through google chrome , if chorme.exe is in that folder.. 
    return 0; 
} 
1

Prova questo:

#include <windows.h> 

int main() 

{ 
    system ("start notepad.exe") // As an example. Change [notepad] to any executable file // 

    return 0 ; 
} 
+2

Potresti per favore [modificare] in una spiegazione del motivo per cui questo codice risponde alla domanda? Le risposte al solo codice sono [scoraggiate] (http://meta.stackexchange.com/q/148272/274165 –

+0

Qual è la differenza tra ciò che hai fatto qui e ciò che SY ha fatto? –

-1

quando eseguibile percorso avere spazi bianchi nella chiamata di sistema!

#include<iostream> 
using namespace std; 
main() 
{ 
    system("explorer C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe "); 
    system("pause"); 
} 
+1

Questo non ha senso - stai chiedendo cosa dovresti fare se c'è spero, o stai cercando di spiegare cosa dovrebbe fare qualcuno in quel caso? – Mogsdad

+0

Sì, provo a spiegare! In questo modo, è possibile utilizzare la funzione "system", no . – CHE98

0

fornire il percorso completo del file 'openfile.exe' e ricorda di non mettere avanti tagliare '/' nel percorso, come c:/Users/nomeutente/etc .... invece di che utilizzano C: \ Users \ nome utente \ etc (per Windows)

Può essere questo vi aiuterà a

Problemi correlati