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