Programowanie w języku C/C++ » Artykuły

Exec

  • 2010-04-25 18:52
  • 7 komentarzy
  • 2998 odsłon
  • Oceń ten tekst jako pierwszy
Obecnie zajmiemy się zagadnieniem uruchamiania innej aplikacji z wnętrza programu.  

Zaczniemy od przykładu:  
 #include <windows.h> 
 
int main(void) 
{ 
      WinExec("NOTEPAD.exe",SW_SHOWNORMAL); 
      return 0; 
}

Omówienie:  
Prototyp zastosowanej w tym programie funkcji WinExec() znajduje się w pliku nagłówkowym windows.h i wygląda następująco:  
UINT WINAPI WinExec(LPCSTR, UINT); 

UINT – unsigned int, jest to kod zwracany przez funkcję, niosący informację dotyczącą sposobu zakończenia pracy aplikacji potomnej.
WINAPI – funkcja pochodząca z interfejsu Win API 16.  
LPCSTR – wskażnik wskazujący lokalicację i nazwę aplikacji potomnej (uruchamianej wewnątrz naszego programu).  
UINT – parametr funkcji (tzw. stałagrupy SW... – od „Show Window". Najczęściej stosowane parametry:  
SW_HIDE - okno aplikacji jest niewidoczne
SW_MINIMIZE - okno aplikacji jest zminimalizowane
SW_SHOWNORMAL - standardowe okno aplikacji

Przykład:
#include <windows.h>
 
int main(void) 
{ 
      int wybor; 
      LPCSTR p1 ="Czy chcesz uruchomić Notatnik?"; 
      LPCSTR p2 ="Pojawił się problem."; 
 
      wybor = MessageBox(0,p1,p2,MB_YESNO | MB_ICONQUESTION); 
 
      if(wybor==IDYES) 
         WinExec("NOTEPADE.EXE",SW_SHOWNORMAL); 
 
      else 
         MessageBox(0,"Nie?... to nie - twoja sprawa, Koniec",MB_OK); 
 
      return 0; 
} 
  
Omówienie:
Występująca w programie zmienna wybór  przechowuje wynik. Jeżeli funkcja MessageBox() zwróci identyfikator klawisza TAK-IDYES, zostanie wywołany notatnik. W przeciwnym razie pojawi się okienko kończące.

  • Spróbujcie tak przekształcić powyższy program, aby zamiast Notatnika uruchamiany był inny program (pamiętajcie wtedy o właściwej ścieżce dostępu).

7 komentarzy

pcmcymc 2010-04-29 15:16

fork()/vfork() i system()

winerfresh 2008-10-28 18:56

A jak to zrobić pod Linuxem??

eiddon 2006-10-29 17:06

Wielkie dzięki cool_szczur - właśnie tego potrzebowałem :-)

gonet9 2006-05-20 15:27

Każdy się pewnie domyśli, ale nie  returm 0; a return.

cool_szczur 2004-07-08 22:33

tak jak napisalem ze podam kawalek kodu dla wywolania CreateProcess:

  TStartupInfo SI;
  TProcessInformation PI;

  memset(&SI,0,sizeof(SI));
  memset(&PI,0,sizeof(PI));
  SI.dwFlags=STARTF_USESHOWWINDOW;
  SI.wShowWindow=SW_SHOWDEFAULT;
  SI.cb=sizeof(TStartupInfo);
  if(CreateProcess(NULL,progName.c_str(),NULL,NULL,true,NORMAL_PRIORITY_CLASS,NULL,NULL,&SI,&PI)) {
    WaitForSingleObject(PI.hProcess,10000);
    WaitForSingleObject(PI.hThread,10000);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  }

ten kawalek kodu otwiera pprogrampodany przez progName i czeka az tez sie zakonczy... jesli nie chcemy czekac to wywolujemy tylko samo CreateProcess... wiecej na ten temat mozna przeczytac w WinAPI

cool_szczur 2004-07-07 12:06

to jest jakis sposób na uruchamianie programów przez nasz program... ale jest dobry szczególnie dla aplikacji 16bit.. w SDK MS Windows napisali że dla aplikacji 32bit najlepiej urzyć funkjci CreateProcess... jak tylko wróce do domu z pracy to wyśle kawałek kodu ...

Khobar 2003-01-05 22:32

Hmm...dobre , dobre , tylko troszkę mało...przydało by sie troszkę więcej na ten temat, moim zdaniem temat nie został wyczerpany....