Exec

Adam Boduch

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

fork()/vfork() i system()

A jak to zrobić pod Linuxem??

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

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

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

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 ...

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