Zmienne środowiskowe

PSzczepan

Zmienne środowiskowe są to zmienne zawierające informacje na temat podstawowych ustawień systemu na danym komputerze (np.: ścieżka do katalogu z plikami tymczasowymi).

Listę wszystkich obecnych w systemie zmiennych środowiskowych można pobrać wywołując okno MS-DOS i wpisując w nim polecenie set.

Jedną z bardziej przydatnych zmiennych środowiskowych jest COMSPEC, która wskazuje na plik command.com w systemach Win 9x/me lub cmd.com w Win NT. Plik ten przydaje się gdy chcemy skierować strumień danych wyświetlanych w aplikacji konsolowej do pliku. Można to zrobić korzystając z kodu poniżej:

shellexecute(handle,'open','command.com','console_application.exe > plik.txt',nil,SW_shownormal);

dodatkowo można uruchomić command.com z parametrem "/c" dzięki czemu po wykonaniu akcji zostanie automatycznie zamknięty. W połączeniu z parametrem SW_hide cała operacja będzie całkowicie niewidoczna dla użytkownika:

shellexecute(handle,'open','command.com',' /c console_application.exe > plik.txt',nil,SW_hide); 

Wadą tego kodu jest jednak to, że nie zostanie on prawidłowo wykonany na systemie z rodziny Win NT (chociaż na WinXP powinno działać). W tych systemach zamiast pliku command.com jest plik cmd.com. Rozwiązaniem problemu może być więc zastosowanie zmiennej środowiskowej "COMSPEC". Aby to zrobić należy skorzystać z polecenia "GetEnvironmentVariable":

GetEnvironmentVariable('COMSPEC',bufor, rozmiar);

Pierwszy parametr to nazwa zmiennej, drugi to zmienna do której ma być zapisana wartosc zmiennej, a trzeci to rozmiar bufora (musi być równy lub większy od długości zwracanej wartości). Aby zwracana wartość była poprawnie zapisywana "bufor" musi być typu bufor:array[byte] of char;

Podstawiając "bufor" do "Shellexecute" otrzymujemy:

shellexecute(handle,'open',pchar(bufor),'/c console_application.exe > plik.txt',nil,SW_hide); 

Aha, byłbym zapomniał, że aby móc korzystać z polecenia "GetEnvironmentVariable" należy w uses dodać "shellapi"

Piotr Szczepaniec
Serwis OHP
http://ohp.magres.net
oddball@enter.net.pl

0 komentarzy