VII. Egyéb bôvítômodulok
Автор: Kádár Zsolt
Дата: 20.06.1999
Источник: https://xenia.sote.hu
Язык: Венгерский
Bevezetés
Az OS/2-be, vagy IBM-es termékekbe beépített "hivatalos" REXX felületek mellett nagyon sok internetrôl letölthetô, freeware/shareware bôvítôcsomag létezik. Ha mindegyiket be akarnánk mutatni, akkor külön tanfolyamat kellene erre a célra szentelni. Persze nem biztos, hogy erre szükség van. Aki eddig végig tudta követni a REXX tanfolyam összes leckéjét, az már biztosan eljutott egy olyan szintre, hogy egy kis bevezetés után már könnyen el fog boldogulni a kisebb nagyobb nem IBM-es fejlesztésû bôvítôcsomagok között. Ezért aztán ebben a leckében nem is teszünk kísérletet arra, hogy átfogó képet nyújtsunk az egyéb bôvítômodulokról, csupán néhány, számomra érdekes vagy fontos csomagot fogunk megnézni.
RxPortIO
Rögtön egy olyan csomaggal kezdjük, amely az alap REXX-bôl teljesen hiányzó funkcionalitást nyújt. Az RxPortIO segítségével ugyanis REXX-bôl programozhatjuk a hardver I/O portokat. Az ingyenesen letölthetô bôvítést annak idején azért készítette el a fejlesztôje, hogy OS/2-bôl tudja használni FM rádiókártyáját. Az RxPortIO az OS/2 Warp által alapesetben mindig betöltött TESTCFG.SYS vezérlô szolgáltatásait használja.
A bôvítôcsomag által nyújtott szolgáltatásoknak vannak bizonyos korlátai is. A bôvítô DLL 32 bites, a függvények azonban 8 bites I/O olvasást tesznek lehetôvé. Az RxPortIO nem képes a megszakítás-vezérelt eszközök kezelésére. A printerportok kezelése is problémákba ütközhet, amennyiben az adott portot a rendszer már lefoglalta a printer számára. A legnagyobb probléma pedig az, hogy a kártyák fejlesztôi általában nem publikálják a regiszterek eléréséhez szükséges adatokat... Azoknál az alkalmazásoknál, amelyeknél a sebesség elsôdleges szempont, az RxPortIO sajnos nem nagyon jöhet számításba. A REXX réteg közbeiktatása sajnos olyan sokat ront az I/O mûveletek sebességén, hogy az akár 1/10-e is lehet az ugyanazt a mûveletet végzô, C-ben írt programnak. A hátrányok ellenére a legtöbb esetben mégis jól használható ez a bôvítôcsomag, s bizony sok esetben ez lehet az egyetlen szalmaszál, ha a kártyához nem adtak OS/2-es drivert.
A csomagban található DLL-t használat elôtt be kell másolni egy olyan könyvtárba, amely benne van a LIBPATH-ban, s a REXX program elején regisztrálni kell a függvényeket:
CALL RXFuncAdd 'PIOLoadFuncs', 'RXPORTIO', 'PIOLoadFuncs' CALL PIOLoadFuncs
A PIOLoadFuncs-on kívül még hét további függvényt rejt az RxPortIO:
Függvény: | Funkció: |
PIOLoadFuncs | Függvények betöltése |
PIODropFuncs | Függvények kitakarítása a memóriából |
PIORead | Port olvasása |
PIOWrite | Port írása |
PIODelay | Várakozás ms pontossággal |
PIOBitPick | Bit kiolvasása |
PIOBitSet | Bit beállítása |
PIOBitClear | Bit törlése |
A csomagban a DLL-en kívül a függvényeket viszonylag részletesen bemutató INF fájl, példaprogram, valamint a vizuális REXX környezetben való használatot demonstráló anyag található.
RxTelnet
A Socket bôvítôcsomag kiegészítéseként lehet felfogni az RxTelnet csomagot, amellyel telnet szekciók kezelése automatizálható REXX-bôl. Bár elvileg a Socket bôvítôcsomag minden olyan elemet tartalmaz, amelyekbôl fel lehet építeni az RxTelnetben felkínált függvények megfelelôit, én még is inkább azt javaslom, hogy elôbb próbáljuk ki ezt a csomagot, ha telnet szekciókkal kell REXX-bôl dolgoznunk. A csomagban nemcsak REXX bôvítôfüggvények, hanem ezek C-bôl is hívható megfelelôje is megtalálható a forráskóddal egyetemben. Mielôtt használni tudnánk a bôvítéseket, be kell másolni az NVT.DLL fájlt (NVT = Network Virtual Terminal, RFC854) a LIBPATH-ba és a REXX program elején megadni a következô sorokat:
Call RxFuncAdd "LoadRtn", "Nvt", "Load_Routine" Call LoadRtn
A csomag a következô függvényeket tartalmazza a fenti kódrészletben már használt LoadRtn mellett:
Függvény: | Funkció: |
Telnet | Telnet szekció létrehozása |
Tget | Karakterlánc olvasása a telnet szekcióból |
Tput | Karakterlánc írása a telnet szekcióba |
Tctl | Szekcióinformáció lekérdezése vagy out-of-band parancs küldése |
Tquit | Telnet szekció zárása |
A bôvítôkönyvtárakon kívül az RxTelnet tartalmaz még egy rövid, ám elégséges leírást a táblázatban is felsorolt REXX (és C) függvények használatáról, s egy REXX és egy C példaprogramot is.
RxIPC
A klasszikus REXX-rôl szóló tanfolyamban azt állítottuk, hogy a REXX nem, vagy csak igen korlátozott mértékben alkalmas folyamatok közötti kommunikációra (IPC = Inter Process Communications), nem képes szálak kezelésére és a szemaforokat sem ismeri. Ezeken a hiányosságokon segít az RxIPC bôvítôcsomag, amely gyakorlatilag egy-az-egyben lemásolja és REXX-ben elérhetôvé teszi az ezen szolgáltatások használatához szükséges rendszerfüggvényeket. Ez persze azt is jelenti, hogy ennek a csomagnak a használata megköveteli, hogy használója jól ismerje a háttérben meghúzódó rendszerfüggvények mûködését. A szükséges ismeretanyag megtalálható a Developer's Toolkit Control Program Guide and Reference könyvében.
Ha már rendelkezünk a szükséges ismeretekkel, akkor másoljuk be a LIBPATH-ba a mellékelt REXXIPC.DLL-t és adjuk ki REXX programunk elején a következô utasításokat:
Call RxFuncAdd 'IPCLoadFuncs', 'REXXIPC', 'IPCLoadFuncs' Call IPCLoadFuncs
Figyeljünk arra, hogy a kis és nagybetûk közötti különbségeket megtartsuk, mivel ez a bôvítôkönyvtár erre érzékeny.
A RxIPC-ben nagy sok függvény található, így ezeket nem soroljuk fel mindet, csak megnevezzük azt a négy függvénycsoportot, amelyek valamelyikébe minden függvény besorolható. Az elsô csoportba tartoznak az IPC bôvítôfüggvényeket részben, vagy teljesen regisztráló, illetve eltávolító függvények. Az IPCLoadFunc minden egyes bôvítôfüggvényt betölt, ezért ha csak nem akarunk nagyon takarékoskodni a memóriával, akkor érdemes ezt használni. A második csoportba tartoznak a csatornák (pipe) használatát lehetôvé tevô függvények (PipeCreate, PipeConnect, PipeWrite, stb.). A harmadik csoportba a folyamatokat (ProcCreateThread, ProcSetThreadPriority, ProcSendSignal, stb.), a negyedikbe pedig a szemaforokat (SemEventCreate, SemMutexCreate, SemStartTimer, stb.) manipuláló függvények tartoznak. Példaképpen tekintsünk meg egy programot, amely átállítja a saját maga futási prioritását:
/* REXX program prioritásának állítása */ /* A segédfüggvények betöltése */ Call RxFuncAdd 'IPCLoadFuncs', 'REXXIPC', 'IPCLoadFuncs' Call IPCLoadFuncs Say IPCVersion() /* Az új prioritási paraméterek bekérése */ Say 'Adja meg az osztályt! (Idle/Regular/Server/Critical)' Parse Pull class IF class <> 'Idle' & class <> 'Regular' & class <> 'Server' & class <> 'Critical' THEN DO Say 'Érvénytelen osztály!' EXIT 1 END Say 'Adja meg a deltát (0-31)!' Parse Pull delta IF delta < 0 | delta > 31 THEN DO Say 'Érvénytelen delta!' EXIT 1 END /* A prioritás átállítása */ Call ProcSetPriority 0, class, delta IF result <> 0 THEN DO Say 'A mûvelet nem sikerült!' result EXIT 2 END ELSE Say 'A mûvelet sikerült!' EXIT
Az RxIPC nagyon részletes, a visszatérési értékek kivételével szinte minden részletre kiterjedô INF fájlt is tartalmaz. A visszatérési értékek és a függvények mûködésének valamint használatának még részletesebb leírása megtalálható a már említett Control Program Guide and Reference könyvben.
RxAsync
A soros portok kezelésére alkalmas az RxAsync bôvítôcsomag. Ez szintén egy olyan terület, amelyre nem lehet klasszikus REXX-bôl bôvítômodulok nélkül betörni. Az RxAsync gyakorlatilag az összes OS/2-es soros kommunikációt elôsegítô függvényt elérhetôvé teszi a REXX programok számára. Sajnos a csomagból kimaradt a dokumentáció. Jobban mondva a dokumentáció a bôvítô DLL mellékelt forráskódjában található, és innen kell kiolvasni a függvények használatának módját. Szerencsére a szerzô mellékelt több példaprogramot is, így egy kis REXX és C gyakorlattal elég jól el lehet boldogulni. A betöltést a következô kódrészlettel kell elvégezni:
Call RxFuncAdd 'RxAsyncLoadFuncs', 'RXASYNC', 'RxAsyncLoadFuncs' Call RxAsyncLoadFuncs
Az RxAsync20 a következô bôvítôfüggvényeket tartalmazza:
Függvény: | Funkció: |
RxAsyncDropFuncs | Bôvítôfüggvények kitakarítása |
RxAsyncLoadFuncs | bôvítôfüggvények betöltése |
RxAsyncPriority | A folyamat prioritásának beállítása |
RxAsyncSleep | Várakozás |
RxAsyncGetDcbInfo | A kontroll blokk információ lekérdezése |
RxAsyncSetDcbInfo | A kontroll blokk információ beállítása |
RxAsyncGetEnhParm | Kiolvassa a kiterjesztett paramétereket |
RxAsyncSetEnhParm | Beállítja a kiterjesztett paramétereket |
RxAsyncGetLnCtrl | Kiolvassa a com port paramétereit |
RxAsyncSetLnCtrl | Beállítja a com port paramétereit |
RxAsyncSetBreakOff | Kikapcsolja a break-et |
RxAsyncSetBreakOn | Bekapcsolja a break-et |
RxAsyncTxImmediate | Azonnal továbbítja a bájtot |
RxAsyncTxStop | Leállítja a transzfert (a'la XOFF) |
RxAsyncTxStart | Elindítja a transzfert (a'la XON) |
RxAsyncGetComStatus | Lekérdezi a com port státuszát |
RxAsyncGetTxStatus | Lekérdezi az adatforgalom státuszát |
RxAsyncGetMdmOutput | Lekérdezi a modem output jeleit |
RxAsyncGetMdmInput | Lekérdezi a modem input jeleit |
RxAsyncSetMdmOutput | Beállítja a modem output jeleit |
RxAsyncGetRxCount | Lekérdezi az RX sorban várakozó karakterek számát és méretét |
RxAsyncGetTxCount | Lekérdezi az TX sorban várakozó karakterek számát és méretét |
RxAsyncGetComError | Lekérdezi a com hibaüzenetet |
RxAsyncGetComEvent | Lekérdezi a com eseményüzenetet |
RxAsyncOpen | Megnyitja a com portot |
RxAsyncClose | Lezárja a com portot |
RxAsyncWait | Inputra vár |
RxAsyncWatch | Vár egy adott sztring beérkezésére |
RxAsyncRead | Adatot olvas és várakozik |
RxAsyncWrite | Adatot ír a com portra |
RxAsyncCarrier | Teszteli/Várakozik a Data Carrier Detect (DCD) jelet/jelre |
RxAsyncBreak | Break-et küld |
RxAsyncDcbInfo | Kinyomtatja a kontroll blokk információt |
RxAsyncActive | Teszteli az aktív modem jelet |
RxAsyncRaise | Kiadja a megadott modem jelet |
RxAsyncLower | Leveszi a megadott modem jelet |
RxAsyncFileExists | Fájl meglétét ellenôrzi |
RxAsyncFileDelete | Fájlt töröl |
RxAsyncFileCopy | Fájlt másol |
RxAsyncFileMove | Fájlt mozgat |
RxAsyncFileRename | Fájlt nevez át |
RxAsyncFileNameIs | Lekérdezi a fájl nevét |
RxAsyncFilePathIs | Lekérdezi a fájl elérési útvonalát |
RxAsyncDirectory | Lekérdezi/Beállítja az elérési utat |
RxAsyncPrint | Kinyomtatja a sztringet a standard outputon |
RxAsyncMsgBox | Grafikus üzenetablakot jelenít meg |
RexxLib
Az elôzô bôvítôcsomagokkal ellentétben fizetni kell az RexxLib csomagért, amelyet a Quercus Systems terjeszt shareware alkalmazásként. Szerencsére bárki letöltheti és kipróbálhatja a több mint 150 függvényt tartalmazó RexxLib-et, mivel az interneten található verzió semmilyen módon sem limitált.
A használathoz be kell másolni a zip fájlban található REXXLIB.DLL és RXWIN30.DLL fájlokat a LIBPATH-ba és ki kell adni a REXX program elején a következô parancsokat:
Call RxFuncAdd 'rexxlibregister', 'rexxlib', 'rexxlibregister' Call rexxlibregister Call RxFuncAdd 'w_register', 'rxwin30', 'rxwindow' Call w_register
Ezen csomag esetében is lényeges helyenként a kis és nagybetûk közötti különbség, ezért a legegyszerûbb, ha egy az egyben átvesszük a fenti kódrészletet. A dokumentáció két INF fájlból áll, amelyek igen jó leírást adnak a függvényekrôl. Természetesen meg sem kíséreljük, hogy itt felsoroljuk ezeket a függvényeket. Ízelítônek azért elárulunk annyit, hogy a REXXLIB.DLL többek között függvényeket tartalmaz az összetett változók még sokoldalúbb felhasználására, a REXX dátumformátumok konverziójára, CRC értékek meghatározására, csatornák (pipes) elérésére és bonyolult matematikai mûveletek elvégzésére. Az RXWINDOW.DLL függvényei segítségével a REXX programok könnyen és gyorsan elláthatók szöveges módú felhasználói felülettel. Az INF fájlok és DLL-ek mellett a RexxLib nagyon sok példaprogramot is tartalmaz, ezért használata viszonylag könnyen és gyorsan elsajátítható.
FileRexx
A FileRexx bôvítôcsomag olyan függvényeket bocsát a felhasználó rendelkezésére, amelyekkel a bináris fájlok kezelését lehet könnyen elvégezni. A klasszikus REXX ezen a területen sem nyújt kimagasló lehetôségeket, így a programot biztosan sokan hasznosnak fogják találni. A bináris fájlkezelésen kívül a FileRexx I/O függvényeket is tartalmaz, valamint lehetôvé teszi fájlok megosztott használatát. A bôvítô DLL megfelelô elhelyezése után a függvényeket az alábbi kódrészlettel lehet regisztrálni:
CALL RxFuncAdd 'FileLoadFuncs', 'FILEREXX', 'FileLoadFuncs' CALL FileLoadFuncs
Ez a csomag a következô függvényeket tartalmazza:
Függvény: | Funkció: |
FileAddFuncs | A bôvítôfüggvények regisztrálása |
FileDropFuncs | A bôvítôfüggvények kitakarítása |
FileOpen | Fájl megnyitása |
FileClose | Fájl lezárása |
FileRead | Fájl olvasása |
FileGets | Sor beolvasása |
FileReadValue | Megadott bájtok beolvasása |
FileReadBlock | Blokkonkénti beolvasás |
FileWrite | Fájlba írás |
FilePuts | Egy sor kiírása |
FileWriteValue | Megadott bájtok kiírása |
FileSeek | Fájlon belüli pozícionálása |
FileDevIOCtl | Eszköz mûködési paramétereinek beállítása |
FileGetInfo | Fájlinformáció lekérdezése |
FileDeleteFile | Fájl törlése |
FileMoveFile | Fájl átnevezése |
FileCopyFile | Fájl másolása |
FileMkDir | Könyvtár készítése |
FileRmDir | Könyvtár törlése |
FileMatchFile | Fájl keresése |
FileSearchPath | Fájl keresése megadott könyvtárban |
FileDriveMap | Kilistázza a meghajtókat |
FileDriveInfo | Információt ad a megadott eszközrôl |
FileGetPath | Megadja a fájl elérési útvonalának komponenseit |
FileEditName | Fájl nevének átalakítása |
FileSysInfo | Operációs rendszer információ lekérdezése |
FileIterateExe | Exe ismételt meghívása |
FileBit | Bináris mûvelet végzése |
FileDoSleep | Várakozás |
A függvények használatának módjáról további információt a zip fájlban található INF fájlban lehet találni. Jó néhány példaprogramot is mellékelt a szerzô, így ennek a csomagnak az elsajátítása is viszonylag egyszerû.
RexxGDB2
Nagyon jól kiegészíti a DB2/2 beépített REXX támogatását a RexxGDB2 csomag, amely többek között lehetôvé teszi a statikus (gyors) SQL parancsok végrehajtását és az SQL parancsok eredményének HTML-be foglalását.
Mielôtt a függvényeket használatba vehetnénk, el kell készíteni a megfelelô package-eket a zip fájlban található BindGDB2.CMD RexxGDB2.BND jelenlétében történô lefuttatásával. Ezután már nincs más hátra, mint bemásolni a REXXGDB2.DLL-t, és a REXX program elején kiadni a következô parancsokat:
Call RxFuncAdd 'g2LoadFuncs', 'REXXGDB2', 'g2LoadFuncs' Call g2LoadFuncs
A RexxGDB2 nagyon sok bôvítôfüggvényt tartalmaz, így arra nincs lehetôség, hogy mindet felsoroljuk ebben a leckében. Aki további információra vágyik, az megtalálhatja azt a zip fájlban mellékelt INF formátumú dokumentációban. A csomag sok példaprogramot is tartalmaz, s a szerzô különösen nagy hangsúlyt fektetett a HTML oldalakat generáló függvények használatára, amelyek segítségével összeházasítható a gépen található DB2 adatbázis és web-kiszolgáló (Goserv).
REXX GYÍK:
K1. Az elôzô leckékben található példaprogramok bôvítômoduljai mind sikeresen betöltôdnek, az itt bemutatottak viszont nem. Miért?
V1. Az elôzô leckékben egy-két kivételtôl eltekintve IBM-es termékek REXX interfészérôl volt szó, amelyek DLL-je automatikusan olyan könyvtárba került a termék telepítésekor, amely benne van a config.sys LIBPATH sorában. Az itt felsorolt termékek azonban nem rendelkeznek telepítôprogrammal, így nekünk kell gondoskodni a kiegészítô függvényeket tartalmazó DLL-ek megfelelô könyvtárba történô bemásolásról.
K2. Honnan lehet további bôvítôcsomagokat beszerezni?
V2. Nagyon sok bôvítâcsomag található a hobbes.nmsu.edu kiszolgáló /pub/os2/dev/rexx könyvtárában.
Gyakorlatok:
1. Alakítsa át a leckében található példaprogramot oly módon, hogy az megadott ideig mind a négy prioritásosztályt beállítsa! Futtassa a programot és jegyezze fel, hogy az egyes prioritási osztályok esetében tudja-e használni a gépet más feladatok végrehajtására is!
Kádár Zsolt 1999. 06. 20. |