[ Pobierz całość w formacie PDF ]
.Definicje obu funkcjizawieraj¹ kilka wywo³añ API, które opiszemy poni¿ej.GetWindowText() to funkcja Win32 zwracaj¹ca nag³Ã³wek (tekst zawarty w paskutytu³u) okna.Uzyskany w ten sposób tekst wyœwietlany jest za pomoc¹ innejfunkcji API, MessageBox(), w celu powiadomienia u¿ytkownika o uruchomieniunowego programu.Przyjrzyjmy siê wzmiankowanej powy¿ej funkcji RunProgramEx(), „opakowuj¹cej”wywo³anie CreateProcess():Wydruk 14.1.Funkcja RunProgramEx()unsigned long RunProgramEx (char* file, char* parameters){STARTUPINFO StartupInfo;ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));PROCESS_INFORMATION ProcessInfo;StartupInfo.cb = sizeof(STARTUPINFO);if(CreateProcess(file,parameters,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartupInfo,&ProcessInfo)){// Uchwyty utworzone przez funkcjê CreateProcess() nale¿y zamkn¹æ.// Mo¿na to zrobiæ w dowolnym momencie, np.teraz.CloseHandle(ProcessInfo.hProcess);CloseHandle(ProcessInfo.hThread);return (unsigned long)ProcessInfo.dwProcessId;}return 0;}Definicja funkcji RunProgramEx() zawiera kilka odwo³añ do API, w tym wywo³aniafunkcji ZeroMemory(), CreateProcess() i CloseHandle().Kluczowym punktem jesttu wywo³anie CreateProcess().Jak sama nazwa wskazuje, funkcja ta tworzy nowyproces, uruchamiaj¹c zadany plik wykonywalny i tworz¹c dlañ nowy w¹tek.Nazwêpliku i argumenty wywo³ania przekazujemy jako parametry funkcji RunProgramEx().Struktura StartupInfo, przekazana jako parametr wywo³ania funkcjiCreateProcess(), zawiera informacje, okreœlaj¹ce sposób utworzenia g³Ã³wnegookna uruchamianej aplikacji.Do zainicjalizowania zawartoœci struktury s³u¿ywywo³anie funkcji API ZeroMemory(), wype³niaj¹cej zadany blok pamiêci zerami.Typ STARTUPINFO, okreœlaj¹cy zawartoœæ struktury, opisano szczegó³owo wdokumentacji API.Wywo³anie funkcji CreateProcess() powoduje umieszczenie informacji w polachstruktury ProcessInfo informacji o utworzonym procesie i jego g³Ã³wnym w¹tku.Typ strukturalny PROCESS_INFORMATION, definiuj¹cy postaæ struktury ProcessInfo,przedstawiono poni¿ej:typedef struct _PROCESS_INFORMATION {HANDLE hProcess;HANDLE hThread;DWORD dwProcessId;DWORD dwThreadId;} PROCESS_INFORMATION;Identyfikator procesu, zwracany przez funkcjê RunProgramEx(), pochodzi z poladwProcessId struktury.Wykorzystujemy go do okreœlenia uchwytów okiennale¿¹cych do uruchomionej aplikacji, co realizuje funkcjaLookForWindowHandle():HWND LookForWindowHandle(unsigned long processid){if (!EnumWindows((WNDENUMPROC)GetWinHandle,processid))return swProcess;elsereturn 0;}LookForWindowHandle() to kolejne „opakowanie”, wykorzystuj¹ce funkcjê Win32EnumWindows().Przegl¹da ona iteracyjnie wszystkie okna najwy¿szego poziomu iwywo³uje dla nich funkcjê zwrotn¹ GetWinHandle(), identyfikowan¹ pierwszymparametrem (zobacz wydruk 14.2).Wydruk 14.2.Identyfikacja okna z u¿yciem funkcji GetWinHandle()HWND swProcess;BOOL CALLBACK GetWinHandle(HWND hwnd, unsigned long hproc){char windowtitle[80];char classname[80];GetWindowLong(hwnd, GWL_HINSTANCE);unsigned long dwProcessId; // adres identyfikatora procesuGetWindowThreadProcessId(hwnd,&dwProcessId); // adres identyfikatora procesuif (dwProcessId != hproc)return true;GetWindowText( hwnd, windowtitle, 80);if (windowtitle[0] == NULL)return true;GetClassName(hwnd, classname, 80);int ptr = strcmp(classname, "TApplication");if (ptr == 0)return true;swProcess = hwnd;return FALSE; // koniec przegl¹dania - uchwyt znaleziony}Funkcja ta ustala identyfikator procesu na podstawie uchwytu utworzonegoprzezeñ okna, zwracaj¹c informacjê o dopasowaniu lub niedopasowaniu dowywo³uj¹cej j¹ funkcji EnumWindows().Zwrócenie przez EnumWindows() wartoœciniezerowej oznacza udane zodentyfikowanie okna, którego uchwyt zostaje zwróconyprzez funkcjê LookForWindowHandle().Wykorzystanie funkcji ShellExecuteEx()Prostsz¹ metodê uruchomienia programu udostêpnia funkcja ShellExecuteEx(),wchodz¹ca w sk³ad grupy funkcji pow³oki (zobacz wydruk 14.3).Jest ona prostszaw u¿yciu ni¿ CreateProcess(), nie udostêpnia jednak uchwytu utworzonego przezsiebie procesu.Jej u¿ycie ilustruje funkcja RunProgram(), przedstawionaponi¿ej.Wydruk 14.3.Uruchomienie aplikacji za pomoc¹ funkcji ShellExecuteEx()int RunProgram (char* file, char* parameters){// Ustal sposób wywo³ania programuSHELLEXECUTEINFO execinfo ;memset (&execinfo, 0, sizeof (execinfo)) ;execinfo.cbSize = sizeof (execinfo) ;execinfo.lpVerb = "open" ;execinfo.lpFile = file;execinfo.lpParameters = parameters;execinfo.fMask = SEE_MASK_NOCLOSEPROCESS ;execinfo.nShow = SW_SHOWDEFAULT ;// Uruchom programif (! ShellExecuteEx (&execinfo)){char data[100];sprintf(data, "Nie mogê uruchomiæ: '%s'", file);MessageBox(NULL, data, "B³¹d!", MB_OK);return -1;}return 0;}Parametrem funkcji ShellExecuteEx() jest struktura execinfo typuSHELLEXECUTEINFO.Najwa¿niejsze jej elementy to nazwa polecenia, w naszymprzypadku open (otwórz), oraz nazwa pliku (tj.otwieranego dokumentu, niesamego programu – przyp.t³um.).Mo¿liwe jest równie¿ przekazanie uruchamianemuprogramowi dodatkowych argumentów.Funkcje ShellExecute() i ShellExecuteEx()wykorzystuj¹ skojarzenia plików, tj.ustalaj¹ uruchamiany program na podstawierozszerzenia nazwy otwieranego pliku.Do funkcji pow³oki powrócimy w dalszejczêœci rozdzia³u [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • listy-do-eda.opx.pl