Artykuły >>
Projekty >>
Downloads >>
Serwis >>
Mając dwadzieścia lat myślałem tylko o kochaniu. Potem kochałem już tylko myśleć. Albert Einstein
/ LHP / artykuly
Delphi - ShellExecute

Wprowadzenie

Bardzo często spotykamy się z programami, które pozwalają wysyłać do autora mejla, czy otwierać jego WWW. Zapewne kiedyś zastanawialiście się jak to zrobić przy pomocy Delphiego. W tym artykule opiszę krótko jak zastosować dostosowaną do tego typu operacji funkcję. ShellExecute - bo o niej mowa, potrafi wykonywać rozmaite operacje - od otwierania pliku, programu do drukowania jego treści. Jeśli chcesz jej użyć - pamiętaj o dodaniu słówka ShellAPI do listy modułów - uses. Będzie to wyglądać nieco podobnie:
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI;

Budowa funkcji ShellExecute

... przedstawia się następująco:
ShellExecute(1, 2, 3, 4, 5, 6); Gdzie poszczególne parametry oznaczają:

  • 1 - Handle (od ang. uchwyt) - uchwyt okna. W większości wypadków piszemy Handle, czyli uchwyt naszej aplikacji.
  • 2 - Typ operacji, zależny od rodzaju wykonywanej pracy, może to być: open, print czy expore - Jednak uwaga! Ten parametr należy wpisywać w apostrofach gdyż jest to typ PChar.
  • 3 - FileName - Ścieżka do pliku lub jego nazwa. Jednak w wypadku wpisania samej nazwy należy uzupełnić ścieżkę w parametrze Directory.
  • 4 - Parameters - Parametr aktualnie uruchamianego programu - wyjaśnię później
  • 5 - Directory - Katalog w którym znajduję się uruchamiany program. Jeśli katalog podałeś już wcześniej (w FileName) możesz to pole zostawić puste (nil)
  • 6 - Sposób uruchomienia aplikacji. Dostępne są: SW_HIDE - aplikacja, zostanie ukryta - nie pojawi się.
    SW_SHOW - pokazanie aplikacji.
    SW_MINIZE - tryp zminimalizowany.
    SW_MAXIMIZED - tryb zmaksymilizowany.
    SW_SHOWNORMAL - otwarcie okna w domyślnych rozmiarach, przypisanych przez programistę.

Przykład z zastosowaniem FileName i Directory: ShellExecute(Handle, 'open', 'NetSpeak.exe', nil, 'C:\Dokumenty\Programy\Delphi\NetSpeak', SW_NORMAL); Takie polecenie uruchomi program NetSpeak z podanego w parametrze Directory katalogu. Można także inaczej, bez Directory: ShellExecute(Handle,'open','C:\Dokumenty\Programy\Delphi\NetSpeak\NetSpeak.exe', nil, nil, SW_NORMAL); Tym sposobem także uruchomimy program.

Przykład zastosowania parametrów (parameters):
Chcesz na przykład aby program (np. zwykły notatnik systemowy) uruchomił się i wczytał jakiś plik. Można to uczynić w ten sposób: ShellExecute(Handle, 'open', 'Notepad.exe', 'C:\MsDos.sys', 'C:\Windows', SW_SHOWNORMAL); Wpisaliście? Działa? Z pewnością - przecież musi! :) Tak teraz do tłumaczenia. Pierwszy i drugi parametr pozostawiam na mocy wcześniejszego tekstu, natomiast trzeci, jak już mówiłem wskazuje nazwę pliku programu, który chcemy otworzyć. Następny parametr to właśnie... parametr :) W naszym wypadku określa plik do otworzenia. Kolejny, już piąty z rzędu to Directory, określa położenie programu z FileName. ...A okno ma pojawić się normalne...

Parametry w grach

Często, zamiast tradycyjnego kodu, w grach, aby uruchomić konsolę do ich wpisywania należy uruchomić grę z parametrem. Parametr ten dopisujemy najczęściej w skrócie do naszej gierki, możemy również uruchomić taką aplikację korzystając z opcji Uruchom z Menu Start lub... przez ShellExecute. Napiszemy teraz prostą komendę uruchamiającą grę Half-Life Blue Shift z parametrem -console. ShellExecute(Handle, 'open','bshift.exe', 'console', 'C:\Gry\Half-Life Blue Shift\', 0); Miłej zabawy ! ;)

Drukowanie dokumentu

Droga ku oświeceniu jest długa ... ;) ale chcąc wydrukować dokument możemy także użyć naszej funkcji. Otóż w miejsce drugiego parametru podstawiamy 'print', a ostatni parametr modyfikujemy do SW_HIDE. W ten sposób dokument zostanie wydrukowany, a program notatnik nie pokaże się nawet na ekranie. jednak musimy pamiętać, iż drukując przez Notatnik musimy używać formatów jakie ten program otwiera, np. *.txt, *.htm, *.php, *.log itp. Nie mogą to być natomiast dokumenty przedstawiające różne formy formatowania tekstu np. *.rtf, *.doc itp. Przykład prosty do zastosowania a zarazem skuteczny: ShellExecute(Handle, 'print', 'MsDos.sys', nil, 'C:\', SW_HIDE); Teraz możecie już wypróbować polecenie, powinno ono wydrukować zawartość pliku MsDos.sys. Nie zapomnijcie jednak o dodaniu do listy uses modułu ShellAPI. Jest to bardzo ważne gdyż inaczej - program się nie skompiluje.

Dodatkowo, czyli jak wysłać do kogoś mejla lub otworzyć WWW?

Jest to szalenie proste, wystarczy pod parametrem ścieżki do pliku podać adres e-mail adresata w postaci: 'mailto:lukas.home.page@gmail.com'.
Oto przykład: ShellExecute(Handle, 'open', 'mailto:lukas.home.page@gmail.com', nil, nil, SW_SHOW); lub z wpisanym tematem... ShellExecute(Handle, 'open', 'mailto:lukas.home.page@gmail.com?Subject=Temat', nil, nil, SW_SHOW); ...i terścią: ShellExecute(Handle, 'open', 'mailto:lukas.home.page@gmail.com?Subject=Temat?Body=Treść', nil, nil, SW_SHOW); Otworzenie, wczytanie strony WWW też nie jest wyjątkowo trudne! Patrz niżej v: ShellExecute(Handle, 'open', 'http://www.at.g.pl', nil, nil, SW_SHOW); Jedynie tyle!

Inne funkcje

Do innych funkcji należy przede wszystkim WinExec. Jest ona dużo prostsza w budowie - posiada tylko dwa parametry, gdzie pierwszy z nich to FileName (Ścieżka do pliku), a drugi ShowCmd - jak ma się pokazać okienko. Do drugiego parametru funkcji WinExec używamy tych samych "słówek" co w ShellExecute: SW_SHOW, SW_HIDE, SW_MINIZE, SW_MAXIMIZED, SW_SHOWNORMAL. Używamy jej następująco: WinExec('C:\Command.com', SW_SHOW);

Zakończenie

Wielkie dzięki wszystkim, którzy dotrwali do końca. Tylko parę słów: "Mam nadzieję, że przyda się wam to w przyszłości." Jeśli czegoś nierozumiesz, może coś źle tłumaczyłem - napisz: lukas.home.page@gmail.com .

Dodawanie nowego komentarza
Komentarz
nick:
e-mail (nie będzie widoczny):
Anty-spam (zaznacz):
Komentarze czytelników
Rav
(wystawiony dnia 2009-05-10 o 12:22)
Witam. Jak można przy pomocy tej funkcji otworzyć stronke www i uzupełnić pola login i hasło na stronce www potrzebuje to konkretnie do serwisu SynDns. Pozdrawiam

Odp: Witam. Za pomocą funkcji ShellExecute jest możliwe nie tyle "uzupełnienie pól" co wywołanie strony z określonymi parametrami. Zadziała to tylko w przypadku w którym zmienne z formularza przesyłane są za pomocą metody GET (czyli jako takie dziwne parametry w pasku adresu). W przypadku drugiego sposobu (meotdy POST - dziwnych parametrow w pasku adresu w tej metodzie nie widać, zmienne przesyłane są inaczej - w nagłówku HTTP) nie jest możliwe wysłanie danych do strony internetowej za pomocą omawianej funkcji ShellExecute. Jeśli zatem Twój formularz jest wysyłany za pomocą metody GET i w pasku adresu widzisz coś takiego: http://www.jakisserwer.pl/formularz.php?temat=JakisWpisanyTemat&komentarz=JakisKomentarz&Nick=JakisNick gdzie parametry "Temat", "Komentarz" oraz "Nick" są nazwami pól formularza to jedynym co musisz zrobić w wywołaniu adresu przez funkcję ShellExecute jest wywołanie właśnie tego adresu. I tyle. Natomiast w przypadku metody POST... nie ma zmiłuj - albo posłużyć się zewnętrznym programem, albo skorzystać z komponentów Indy (dość łatwo jest to zrobić za ich pomocą - jakieś 10 linijek kodu), albo posłużyć się WinAPI i biblioteką WinSock (trudne).
Snikers
(wystawiony dnia 2008-08-07 o 07:43)
Chciałbym otworzyć dokument html w Wordzie. Czy jest to możliwe z użyciem tej funkcji bo jakoś nie moge na to wpaść. Pozdrawiam

>> Odp: Osobiście posiadam Office 2000 i otworzenie dowolnego dokumentu (tutaj jest nim plik HTML) jest możliwe poprzez instrukcję: ShellExecute(Handle,'open','WINWORD.EXE','C:\dokument.html','c:\Program Files\Microsoft Office\Office',SW_MAXIMIZE); Jeśli to nie pomoże, należy zaznaczyć, że aby uruchomić program Word i wczytać do niego określony plik należy posłużyć się poleceniem: Microsoft Windows XP [Wersja 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\Documents and Settings\XXX>"c:\Program Files\Microsoft Office\Office\WINWORD.EXE" /f "C:\dok.doc" ...które wpisane do wiersza poleceń (bądź w pole Uruchom) spowoduje uruchomienie programu Word i wczytanie określonego pliku - w tym wypadku C:\dok.doc

Łukasz "Lukas" Wyporek
lukas.home.page@gmail.com

Dexter