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

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

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

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

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

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

A jak to zrobić pod Linuxem??

fork()/vfork() i system()