Magazyn NoName Numer 6 (05/00) http://www.noname.zum.pl
|
Aplikacje dwusystemowe
W tym arcie postaram się opisać jedną ciekawą rzecz. Uruchamiając WINDOWSowy program pod DOSem zobaczymy głupi komuniakt Możemy to zmienić i to jest celem tego arta. Są na to 3 sposoby :
- Przetłumaczenie komuniatu na język POLSKI
- Napisanie DOSowej wersji programu i w zależności od systemu zostanie uruchomiona odpowiednia wersja programu (DOSowa wersja może byc okrojona)
- Próba uruchomienia WINDOWSa a potem programu
Jeśli jest uruchomiony WINDOWS, to normalnie uruchomi się WINDOWSowa wersja programu.
Otóż pisząc program pod Windows chcielibyśmy aby program też był w wersji DOSowej. Jednak jak to mamy napisać ??? Czyżby maiłbyć plik DOS.EXE i WIN.EXE ??? To by wyglądało trochę dziwne. Czy nie lepiej by było aby dać jeden plik EXE, który by wykrywał, czy program jest uruchomiony w DOSie, czy w WINDOWSie i uruchamiał by odpowiednią wersję. Co prawda czeka nas dwa razy tyle pracy (musimy pisać osobno wersję pod WINDOWS a osobno wersję pod DOSa) Zawsze możemy pod DOSa napisać wersję okrojoną. Chyba lepiej jest napisać nawet okrojoną wersję niż użytkownik maiłby przeczytać koumikat This program reqiuted Microsoft Windows 9x. Co prawda potrzebujemy jakiegoś języka programowania pod DOSa, np. Turbo Basic, Turbo Pascal, C, C++, czy Zdzich Dla osób znających jeden z tych języków programowania nie będzie chyba problemu napisać jakiejś uproszczonej wersji. Znająć VB zawsze można poduczyć się Turbo Basica, który jest podobny do VB. Pozostaje jeszcze jedna rzecz : musimy napisać program zarządzający, który wykrywa system operacyjny i uruchamia odpowiedni program. Napisałem razem z Mikroprocesorem program w Pascalu. Poniżej publikuję źródło :
{ *********************************** * * * STARTER v 1.0 * * (c) Jelcyn & Mikroprocesor 2000 * * * *********************************** }
{$M $4000,0,0}
Program windoza; USES crt,dos;
var W:boolean; a:byte; P:string;
function JestWindows: boolean; assembler; asm mov ax, 160Ah int 2Fh or ax, ax jnz @@1 cmp bx, 3 jb @@1 mov al, 1 jmp @@2 @@1: xor al,al @@2: end;
BEGIN clrscr; write('STARTER v 1.0 (c) Jelcyn & Mikroprocesor 2000'); writeln('Prosze czekac na uruchomienie programu ...'); {To po to, jak by sie program pod winde dlugo ladowal, aby uzytkownik sie nie niecierpliwil}
{Tutaj program troche popracuje} W:=JestWindows; {Dos czy Windows ???} for a:=1 to paramcount do Begin {Przechwyc parametr z lini komend} P:=p+paramstr(a)+' '; end;
{A tu uruchomi wlasciwy program} SWAPVECTORS; if W=true then Exec('WinPROG.exe',P) else Exec('DosPROG.exe',P); SWAPVECTORS; END.
Jak widać źródło nie jest zbyt skomplikowane ;-) Tak na serio, to najważniejsze jest kilka ostatnich linijek (i funkcja JestWindows). Wersje programu pod DOSa nazywamy DosProg.exe a wersja pod Windowsa to WinProg.exe. Niestety próbowałem zmienić nazwy na DAT, ale zamiast się uruchomić to w Pascalu funkcja EXEC uruchomiła NOTATNIK WINDOWS !!! Niestety musimy cierpieć przez głupotę programistów Borlanda. Jednak taki starter jest bardzo dobry. Jeśli uważasz, że jest to niepotrzebne, to się myslisz. Co prawda nie musisz pisać wersji pod DOSa. Wystarczy, że napiszesz programkik, który wyświetla poską wersję kounikatu pod WINDOWS i informacje o programie, lub program który uruchamia WINDOWS a w WINDOWSie windowsową wersję programu. Oto ten program :
{ WINRUNER v 1.0 (c) Jelcyn 2000 }
PROGRAM WinRun; {$M $4000,0,0} USES crt,dos; var A,B:byte; {zmienne do petli FOR} G:string; {sciezka programu} I:string; {nazwa z sciezka programu z niej jest robiona zmienna G} J:string; {nazwa programu, ktory mam byc uruchomiony (do tego trzeba dodac sciezke) czyli zmienna G}
BEGIN J:='winprog.exe'; {Tu wpisz nazwe pliku, ktory jest programem WINDOWSowym}
I:=ParamStr(0); for a:=0 to length(I) do Begin if I[a]='\' then b:=a; { Liczenie ostatniego \ do ~cieuki programu } end;
for a:=1 to b do {wyciˇganie z nazwy pliku ~cieuki} Begin G:=G+I[a]; {To jest sciezka} end;
clrscr; write('WinRun v 1.0 (c) Jelcyn 2000'); repeat until keypressed; G:=G+J; {Pelna lokalizacja programu WINDOWSowego} write('Trwa uruchamianie systemu windows aby moc uruchomic ten program'); Exec('c:\windows\win.com',G); {Uruchomienie windowsa, a wraz z nim programu WINDOWSowego} repeat until keypressed; END.
Jak widać ten programik jest bardziej skomplikowany. Ale za to dba o uruchomienie WINDOWSa i programu pod WINDOWS. Całe źródło opiera się praktycznie na wydobyciu ścieżki programu (z nazwy pliku) i doanie do tego nazwy programu. Poczytaj komentarze, to się dowiesz, o co chodzi. Oczywiście ten program nie jest dobry, bo co się stanie, jak ktoś go uruchomi pod Windowsem ??? Zostanie wyświetlony głupi komunikat, że Windows jest już uruchomiony a nie zoistanie uruchomiony nasz program. Dlatego postanowiłem połączyć pierwszy i ostatni program. Jak program wykryje Windows, to uruchomi sam program a jak wykryje DOSa, to spróbuje uruchomić i WINDOWS i program. Oto źródło (ja zwykle w Pascalu) :
PROGRAM WINRUN2; { (c) Jelcyn & Mikroprocesor 2000 Ten program wykrywa jaki jest uruchomiony system operacyjny, jesli windows to uruchamia program a jesli DOS to najpierw uruchomi WINDOWS a potem program} {$M $4000,0,0} USES crt,dos;
var W:boolean; a,b:byte; {zmienna do for} P,G,I,J:string;
function JestWindows: boolean; assembler; asm mov ax, 160Ah int 2Fh or ax, ax jnz @@1 cmp bx, 3 jb @@1 mov al, 1 jmp @@2 @@1: xor al,al @@2: end;
BEGIN clrscr; write('WinProgRun v 1.0 (c) Jelcyn & Mikroprocesor 2000'); J:='winprog.exe'; {Tu wpisz nazwe pliku, ktory jest programem WINDOWSowym}
W:=JestWindows; {Dos czy Windows ???} for a:=1 to paramcount do Begin {Przechwyc parametr z lini komend} P:=p+paramstr(a)+' '; end;
{A tu uruchomi wlasciwy program} SWAPVECTORS; if W=true then Exec(J,P) else Begin
I:=ParamStr(0); for a:=0 to length(I) do Begin if I[a]='\' then b:=a; { Liczenie ostatniego \ do ~cieuki programu } end;
for a:=1 to b do {wyciˇganie z nazwy pliku ~cieuki} Begin G:=G+I[a]; {To jest sciezka} end;
G:=G+J; {Pelna lokalizacja programu WINDOWSowego} write('Trwa uruchamianie systemu windows aby moc uruchomic ten program'); Exec('c:\windows\win.com',G); {Uruchomienie windowsa, a wraz z nim programu WINDOWSowego}
end; SWAPVECTORS; END.
Ten program jest już naprawdę skomplikowany !!! Jak wiesz o co chodzi w programie pierwszym i drugim, to OK, zrozumiesz i ten. Podobno niektóre programy miały taki STUB, że uruchamiały windows i samego siebie, jeśli były uruchomieone w DOSie, niestety STUBa modyfikować nie możemy, ale możemy dać taki plik i nadać mu nazwę np GO.EXE Jak widać wiele możemy zrobić. Gdyby tylko funkcja EXEC poprawnie uruchamiła pliki DAT (normalne EXE ze zmienioną nazwą) to było by już dobrze. Wtedy, to nikt by nie uruchamiał pliku WINPROG.EXE, tylko RUN.EXE lub podobny. Jeśłi znasz jakąś dobrą funkcję która uruchamia pliki niezależnie od rozszerzenia np. taka jak SHELL z VB to napisz !!! Można o3wiście napisać te programiki w ... Turbo Basic'u. Nawe możecie mi zadać pytanie, czemu to pisałem w Pascalu a nie w TB, skoro to zin o VB i TB jest bardziej na miejscu ??? Po pierwsze, nie chcesz, to nie czytaj tego arta. Po drugie TP jest bardziej dostępny i uczony w szkołach (więc łatwo można zdobyć kompilator). Po trzecie Turbo Basic nie był rozwijany zatrzymał się na wersji 1.1 i a mniejsze możliwości od Pascala i nawet nie umiał bym w nim napisać kilka rzeczy (np. wkładki asemblerowej) Po czwarte TB generuje pliki EXE o rozmiarze 27 KB + kod a Pascal o rozmiarze 4KB + kod.
Pisząc ten art chciałbym podziękować Mikroprocesorowi który specjalnie dla mnie napisał wkładkę asemblerował (czyli główny kod) i podsunął już dawno pomysł na ten art. Chciałym też podziękować grupie VB, która odpowiedziała na jedno drobne pytanko no i COSIemu, że zainteresował mnie Pascalem. Gdyby nie te osoby, to ten art by nie powstał.
Pozostaje jeszcze jedna ciekawa rzecz : jeśli nie masz TP to nie martw się : pliki tu są dołączone (źródło + plik EXE) Jeśli chcesz pisać proste programiki pod DOSa (chodzi mi o ten pierwszy programik, co uruchamia wersję DOSową programu) to możesz np przetłumaczyć text W pascalu to będzie tak wyglądało :
PROGRAM winstub;
BEGIN writeln('Ten program wymaga Micorosoft Windows do prawidlowiego dzialania'); writeln('Napisz WIN aby uruchomic windows a potem uruchom ten program ponownie'); END.
Jeśli jednak nie masz legalnego Pascala (lub nie masz go wogóle) to proponuję zerknąć na stronę http://zdzich.koti.com.pl/index.htm i ściągnąć darmowy język programowania Zdzich. Jest to prosty nowy język programowania, którego jestem współautorem. Idelnie nadaje się do pisania takich właśnie prościutkich komunikatów czy gier tekstowych. Oto ten sam program napisany w Zdzichu :
PISZL Ten program wymaga Micorosoft Windows do prawidlowiego dzialania PISZL Napisz WIN aby uruchomic windows a potem uruchom ten program ponownie KONIEC
Jak widać komendy są w języku polskim. Co do zdzicha, to nie nadaje się on do napisania poważniejszych programów (np. pierwszego, trugiego i trzeciego) ale można proste rzeczy w nim napisać. Poza tym podaję to jako taką ciekawostkę
W Turbo Basicu, to by tak wyglądało :
PRINT "Ten program wymaga Micorosoft Windows do prawidlowiego dzialania" PRINT "Napisz WIN aby uruchomic windows a potem uruchom ten program ponownie"
Nie wykluczone, że wkrótce pojawi się druga część tego artu. Jak uda mi się opracować jakąś lepszą metodę, to na pewno to napisz. Sorry za to, jeśli nic z tego nie zrozumiałeś, ale próbowałem to tłumaczyć w mairę prosto. Jednak nie jest to prosta sprawa, tym bardziej, że możesz nie znać Pascala
Jelcyn & Mikroprocesor & grupa VB Wiem, że zamiast pisać o VB, dużo odwoływałem się do Pascala, ale niestety w VB nie można pisać programów pod DOSa. Myślę jedna, że ten art spowoduje, że wzrosną Twoje umiejętności programistyczne. Jak widać czasem się przydaje znajomość kilku języków programowania !!!
Ten art pochodzi z zinu o VB (VBMagazine)
Początek artykułu

Copyright (c) 1999 - 2000 NoName |
|