Otwieranie rożnych aplikacji z aplikacji Delphi.

0

Witam,

mam problem napisałem sobie program w delphi do otwierania aplikacji z pliku tzn. mam katalog o nazwie X w którym znajdują się poszczególne katalogi 1,2,3,4 w każdym z nich są programy dodając komendę do butona otwierania aplikacji:

WinExec('C:\X\1\1.exe',SW_SHOW);

lub

shellexecute(handle,'open','C:\X\1\1.exe',nil,nil,sw_shownormal)

nie działa to prawidłowo ustawienia otwieranej aplikacji zapisują się nie w katalogu z aplikacją np 1 tylko tam gdzie jest program, tylko w katalogu X również uruchamiany program np 2 ma problem z zadziałaniem gdyż nie pobiera ustawień z tego katalogu.

Będę wdzięczny za pomoc w rozwiązaniu problemu.

Pozdrawiam,
Marek

2

Jeden z parametrów Shellexecute jest directory. Spróbuj tam przekazać ścieżkę do prawidłowego katalogu i sprawdź czy to pomoże.

ShellExecute(Handle, 'open', 'calc.exe', '', 'C:\Windows', SW_SHOWNORMAL);
0

Dzięki zadziałało ma jeszcze jedno pytanie jak zrobić żeby poszczególne aplikacje otwierał się z uprawnieniami administratora.

Dziękuję

Pozdrawiam

2

Zamiast *open *zastosuj runas:

ShellExecute(Handle, 'runas', 'calc.exe', '', 'C:\Windows', SW_SHOWNORMAL);
0

ok dziekuje

3

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 :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1