Przypnę się do wątku, aby nieco bardziej rozjaśnić temat, dlatego że sporo użytkowników ma problemy z tą funkcją; Powinien się przydać potomnym, jeśli trafią z Google do tego wątku;
1. lpOperation
W tym parametrze należy podać ciąg oznaczający daną operację - jest ich kilka; Standardowy open
otwiera zadany plik wykorzystując bieżące uprawnienia; Opcja runas
jak już napisano, wymusza użycie uprawnień administratora;
2. lpFile
W tym parametrze należy podać gołą nazwę pliku, bez żadnych ścieżek czy parametrów - dla nich przewidziane są inne argumenty funkcji; Możliwe jest podanie nazwy pliku z rozszerzeniem, a także bez rozszerzenia; Najróżniejsze pliki dokumentów, obrazów itd. potrzebują podania rozszerzenia, jednak pliki wykonywalne niekoniecznie; Możliwe jest też podanie samej nazwy pliku bez rozszerzenia, a także bez określania ścieżki tego pliku w parametrze lpDirectory; Przykład:
ShellExecute(0, 'open', 'calc', nil, nil, SW_SHOWNORMAL)
Powyższy kod bez problemu otworzy systemowy kalkulator; Skąd system wie, o który plik chodzi i skąd wie gdzie go szukać? Odpowiedź - zapewne z rejestru systemu; Podany kod działa dokładnie tak samo jak wpisanie słówka calc
w oknie Uruchom...; Aby możliwe było otwarcie w taki sposób dowolnego własnego programu, należy umieścić odpowiedni klucz w poniższej gałęzi rejestru:
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\'
Klucz ten musi posiadać taką samą nazwę jak plik wykonywalny; Mając plik foo.exe
, znajdujący się w katalogu C:\Bar
, tworzymy klucz o poniższej nazwie:
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\foo.exe'
oraz jako wartość domyślną podajemy pełną ścieżkę aplikacji, czyli C:\Bar\Foo.exe
, a także tworzymy wartość o nazwie Path
i wpisujemy do niej ścieżkę programu, czyli C:\Bar
; Po zamknięciu edytora rejestru, możemy otworzyć okienko Uruchom... i wpisać tam foo.exe
lub samo foo
(case insensitive)); Traktować jako ciekawostkę;
3. lpParameters
W tym argumencie podajemy ciąg z parametrami dla otwieranego pliku; Jeśli funkcja ta ma otworzyć zadany plik tekstowy w systemowym notatniku, w tym parametrze należy umieścić nazwę pliku; Przykład:
ShellExecute(0, 'open', 'notepad', 'C:\Foo.txt', nil, SW_SHOWNORMAL)
Nazwa aplikacji bez rozszerzenia, a także brak ścieżki programu, bo system zna ten program i wie gdzie się znajduje; Jeśli chcemy programowi podać więcej parametrów - możemy to zrobić; Przykład - otwarcie dwóch plików tekstowych w aplikacji Notepad++.exe:
ShellExecute(0, 'open', 'notepad++.exe', 'C:\Foo.txt C:\Bar.txt', 'D:\Programy\Notepad++\', SW_SHOWNORMAL)
Jeżeli któryś z parametrów może zawierać w sobie białe znaki, trzeba będzie objąć go znakami ""
, np. "C:\My File.txt"
;
4. lpDirectory
W tym argumencie podajemy ścieżkę otwieranego pliku, może być zakończona znakiem \
lub nie; Przykłady są powyżej, więc nie ma co się rozpisywać; Jak wcześniej napisałem, parametr ten może przyjmować wartość Nil, o ile system wie, gdzie tego pliku szukać; W przeciwnym razie dostaniemy w rezultacie kod błędu;
5. nShowCmd
Parametr ten określa tryb otwarcia pliku lub programu - najpopularniejsze to SW_SHOW
/SW_SHOWNORMAL
; Możemy korzystać ze stałych z prefiksem SW_
, ale można też podać gołe liczby, o ile wiemy że są obsługiwane;
6. Rezultat
W rezultacie funkcji otrzymujemy liczbę; Jeśli operacja powiedzie się, otrzymamy liczbę większą niż 32
; Mniejsza wartość oznacza jakiś błąd wywołania; Możemy go sprawdzić np. w instrukcji wyboru Case Of - do dyspozycji mamy wartość 0
, stałe z prefiksem ERROR_
oraz SE_ERR_
;
No, mam nadzieję, że teraz problem uruchamiania programów i otwieranie różnych plików za pomocą funkcji ShellExecute jest rozjaśniony; Oczywiście funkcja ta ma znacznie więcej możliwości (inne kombinacje wartości, możliwość otwierania domyślnych programów do wysyłania e-maili, drukowania dokumentów itd.), jednak to pozostawiam innym ciekawskim :]