2013-03-15 13 views
19

Co chcę zrobić, to otworzyć .exe z innego .exe. Naprawdę nie wiem, jak to zrobić, więc przeszukałem internet. Próbowałem niektóre sugerowane metody z Internetu, ale nie działało.Jak otworzyć plik .exe z innego pliku C++ .exe?

Oto mój kod:

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

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

Kiedy uruchamiam go w DEV C++, nie skompilować i pojawia się błąd. Czy ktoś może mi pomóc?

+2

Jaki jest błąd? W każdym razie, na przeczucie, [system man] (http://linux.die.net/man/3/system) - spróbuj '#include ' – RageD

+8

Możesz wypróbować 'fopen()'. To otworzy twój .exe. –

+0

RageD, dziękuję za to, że został skompilowany, ale program nadal nie otwiera openfile.exe –

Odpowiedz

45

Należy zawsze unikać system() ponieważ

  • Jest zasobem ciężki
  • pokonuje zabezpieczenie - nie znam cię, że to ważna komenda lub robi to samo na każdym systemie, można nawet uruchamiać programy, których nie planowałeś uruchomić. Niebezpieczeństwo polega na tym, że po bezpośrednim uruchomieniu programu otrzymuje on te same uprawnienia, co program, co oznacza, że ​​jeśli na przykład działasz jako administrator systemu, to złośliwy program, który właśnie został nieumyślnie uruchomiony, działa również jako administrator systemu. . Jeśli to nie przestraszy cię głupio, sprawdź tętno.
  • Programy antywirusowe go nienawidzą, Twój program może zostać oznaczony jako wirus.

Powinieneś użyć CreateProcess().

Możesz użyć Createprocess(), aby tylko uruchomić .exe i utworzyć dla niego nowy proces. Aplikacja będzie działać niezależnie od aplikacji wywołującej.

Oto przykład kiedyś w jednym z moich projektów:

#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: Błąd otrzymujesz dlatego trzeba podać ścieżkę do pliku .exe nie tylko nazwa. Openfile.exe prawdopodobnie nie istnieje.

+1

Dołączyłem plik nagłówkowy 'windows.h', aby dokończyć kod – SAAD

+0

Jest dobry przykład w https: //msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx (na końcu linku w tej odpowiedzi, ale łatwo go przeoczyć). I mała wskazówka, jeśli ktoś używa 'lpApplicationName' z exe-path, która zawiera spacje, ** nie powinna być otoczona' '', tylko jeśli zarówno exe jak i linia poleceń jest w argv [1]. – 244an

+1

Myślę, że musisz zmienić funkcję z void na bool i zwrócić true/false na podstawie sukcesu CreateProcess() –

0

Otrzymujesz ten błąd, ponieważ nie podajesz pełnej ścieżki. (C: \ Users ... \ file.exe) Jeśli chcesz usunąć ten błąd, podaj pełną ścieżkę lub skopiuj tę aplikację (którą chcesz otworzyć) do folderu, w którym znajduje się twój projekt (.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

Spróbuj tego:

#include <windows.h> 

int main() 

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

    return 0 ; 
} 
+2

Czy mógłbyś wyjaśnić dlaczego ten kod odpowiada na pytanie? Odpowiedzi tylko na kod są zniechęcane (http://meta.stackexchange.com/q/148272/274165), ponieważ nie uczą rozwiązania: –

+0

Jaka jest różnica między tym, co tu zrobiłeś i co zrobił SY? –

-1

gdy wykonywalny ścieżka mają spacje w wywołaniu systemowym!

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

To nie ma sensu - czy pytasz, co powinieneś zrobić, jeśli jest coś itespace, czy próbujesz wyjaśnić, co ktoś powinien zrobić w tej sprawie? – Mogsdad

+0

Tak, próbuję wyjaśnić! W ten sposób możesz użyć funkcji "system", no . – CHE98

0

podać pełną ścieżkę dostępu do pliku „openfile.exe” i pamiętać, aby nie wkładać ukośnik „/” w ścieżce, takich jak c:/Użytkownicy/nazwa_użytkownika/etc .... zamiast tego sposobu użycia C: \ Users \ nazwa_użytkownika \ etc (dla Windows)

Może to pomoże Ci