OS2.org Site Index - Feedback - Impressum
Sprachauswahl / Choose your Language News Software Hardware Projekte Forum Tipps Links Verschiedenes
Editorial Diskussion HelpDesk Umfrage
[Forum]
in nach (Erweiterte Suche)
[Forum]
( Archiv ) ( Neues Thema )

( Zeige die Threadübersicht ) ( Zur Startübersicht )
23.07.2000
Wie und Was: Die Besonderheiten der REXX-Funktion RxFuncAdd,( Teil I) Die Registrierung (von: GA, 14:44:53) ^
1. Allgemeine Syntax

rc = RxFuncAdd(name, dll, entry)

Die eingebaute OS/2 Funktion RxFuncAdd (function add = Funktion hinzufügen) registriert systemweit die Funktion mit dem Namen name, die in der dynamischen Bibliothek (Dynamic Link Library = DLL) mit dem Namen dll (aber meistens ohne die Extension *.dll)unter dem Einsprungspunkt(entry point) entry enthalten ist. Ein Fuktionsergebnis von rc = 0 bedeutet (nur), daß die Registrierung in eine Liste erfolgreich war. Der Name von entry ist dabei sensitiv, daß bedeutet, daß falls der Name nicht exakt die Groß- und Kleinschreibung des Namens in der DLL wiedergibt, die Funktion nicht geladen werden kann. Wie gebau der Name des entry geschrieben wird, kann man mit der Routine EXEINFO(suche im helpdesk) ausgeben.
Der aktuelle Name vom 1. Argument name kann innerhalb der gültigen OS/2 Funktionen frei gewählt werden, so daß man meistens hier eine kürzere oder verständlichere Bezeichnung der Funktion wählen kann.

2. Externe REXX - Funktionen in einer DLL

Externe Funktionen, die als Funktionspaket in einer DLL gespeichert sind, können in einem Programm erts dann aufgerufen werden, wenn die verbindung zwischen dem Programm und der DLL hergestellt sind. Diese verbindung wird durch eine Registrierung einer Funktion mit RxFuncAdd erzeugt.

2. Wichtige Hinweise

RxfuncAdd prüft weder die Existenz der DLL dll noch ob die zu registrierende Funktion name und der Einsprungspunkt entry in der DLL vorhanden sind. Das Funktionsergebnis rc = 0 bedeutet lediglich, daß die Registrierung vorgenommen, d.h. daß die Funktion name in eine Speichertabelle eingetragen wurde. Erst beim Aufruf der zu registrierenden Funktion wird festgestellt, ob die Funktion (im Arbeitsspeicher) vorhanden ist. Wenn nicht, wird der REX0043 Fehler ausgegeben. Der englische Text des Fehler lautet:

REX0043: ***Routine not found***

EXPLANATION: A function has been invoked within an expression (or
a subroutine has been invoked by a CALL) but it
cannot be found. No label with the specified name
exists in the program, it is not the name of a
built-in function, and the language processor has
been unable to locate it externally.
ACTION: Check for: - a mis-typed label or name
- a symbol or literal string adjacent to a '('
when it should have been separated by a
blank or some other operator (this would
be understood as a function invocation)

Siehe auch: http://www.howzatt.demon.co.uk/articles/12dec96.html

Im folgenden Kapitel werden Beispiele und Methoden gezeigt, wie man die oben genannten Defizite teilweise reduzieren kann.

Wer kann hierzu Ergänzungen und/oder Korrekturen vorbringen?





[ Leser: 114 ]

24.07.2000
Re: Wie und Was: Die Besonderheiten der REXX-Funktion RxFuncAdd,( Teil I) Die Registrierung (von: Hans Martin Sauer, 14:14:51)
Hallo,

Ich habe schon mehrfach versucht, mit emx+gcc 2.8.1 eine DLL fuer REXX (W4, FP12) zu schreiben, allerdings hat REXX das bisher immer mit einer Fehlermeldung (Error in Routine...) "gewürdigt". Hingegen funktionieren meine selbstgestrickten DLLs ansonsten, d.h. wenn das aufrufende Programm ebenfalls mit emx+gcc erzeugt wurde, ohne Probleme. Meine Frage: muss man bei der Parameterübergabe an die betreffende dll-Funktion unter REXX irgendetwas besonderes beachten ? Soweit ich mich erinnere, muss man zum Compilieren einer DLL unter emx+gcc die Anzahl der Doublewords angeben (*.imp-Datei), die einer DLL-Funktion als Parameter uebergeben werden sollen, aber wieviele Doublewords belegt eine unter REXX definierte Integer- oder Float-Variable ?

Quelle Nr. 1: Konventionen für REXX unter C (von: GA, 14:39:47)
http://www.scoug.com/warpexpowest/presentations/rexx-c/

Hier sind mit Beispielen die Konventionen, auch die Argumentenübergabe gezeigt.

Es gibt auch noch ein offizielles IBM Red Book dazu, ich poste es hiernach.

Quelle Nr. 2: Red Book : From Bark to Byte (von: GA, 14:46:35)
OS/2 REXX: From Bark to Byte, GG24-4199-00

Abstract

This document describes OS/2 REXX from a usage and application
scenario basis. It includes OS/2 REXX interfaces to CM/2, DB2/2 and
MMPM/2. This document is intended for IBM system engineers, IBM
technical advisors, IBM authorized dealers, IBM customers and others
who require a knowledge of OS/2 2.1 REXX and its interfaces.
A working knowledge of OS/2 2.1 and REXX is assumed.
This redbook is available in hardcopy format through www.fatbrain.com

Table of Contents

Chapter 1. Why REXX? 1.0
Chapter 2. OS/2 REXX Specifics 2.0
Chapter 3. External Functions 3.0
Chapter 4. REXX Utilities External Function Package (REXXUTIL) 4.0
Chapter 5. The Workplace Shell and REXX 5.0
Chapter 6. REXX and C 6.0
Chapter 7. Multimedia REXX 7.0
Chapter 8. REXX Interfaces to CM/2 EHLLAPI 8.0
Chapter 9. REXX Interfaces to DB2/2 9.0
Chapter 10. Visual REXX Builders 10.0
Appendix A. REXX Syntax Diagrams A.0
Appendix B. OS/2 DB2/2 REXX Reference B.0
Appendix C. OS/2 Workplace Shell Setup Strings and Color Definitions C.0
Appendix D. CM/2 REXX EHLLAPI Reference D.0
Appendix E. Published Books, Manuals, and Papers on REXX E.0




Publish date
Dec-31-1993

Lead author
Oscar Cepeda

ISBN number
0738405728

Number of pages
358

In diesem Buch findest du unter Kapitel 6 die gesuchten Informationen. Das Buch kannst du dir als PDF-Datei(siehe rechts oben) laden:

http://www.redbooks.ibm.com/abstracts/gg244199.html



Quelle Nr. 3: EDM/2 (von: GA, 15:08:36)
Die hier gzeigte Quelle(EDM/2 ist wieder nicht direkt erreichbar) zeigt eine Anbindung unter C bei MVS, also nicht mehr auf der Höhe der Zeit. aber zum verständnis vielleicht noch beitragend. Man soll ja zum einem Thema, in das man sich hineinarbeitet, immer mehere Qullen lesen:

http://www.google.com/search?q=cache:www.edm2.com/0510/rexxdll.html+rexx+dll+&hl=en

Quelle Nr. 4: EDM/2 mit anderen Ausführungen (von: GA, 15:18:40)
Sehr detailliert wird hier noch mal ein Beispiel gezeigt:

http://www.google.com/search?q=cache:www.edm2.com/0106/rexxapps1.html+rexx+dll+&hl=en

27.07.2000
Re: ... RxFuncAdd ... entry (von: Manfred Greulich, 17:09:03)
Hallo GA,
wenn bei RxFuncAdd(name, dll, entry) "entry" case-sensitive ist, warum funktioniert dann CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'? Laut EXEINFO heißt der Entry "SYSLOADFUNCS".
Unter NT mit Regina V2.1 und Regutil 1.1.2 heißt der Entry "sysloadfuncs", und da funktioniert CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' dann auch nicht.
mfg mgr

28.07.2000
Wenn man ... (von: GA, 12:04:43)
mit dem angegebenen Entry-Namen nicht die Funktion oder wie bei SysLoadFuncs alle Funktionen registrieren kann, dann liegt höchstwahrscheinlich (neben Schreibfehlern des/der Autoren z.B.) solch eine Sensitivität vor. Diese kann man dann mit EXEINFO oder
EXEHDR überprüfen. Das sind meine Erfahrungen bei REXX-Funktionen, die nicht aus REXXUTIL.DLL registriert wurden.
Über WIN-XX kann ich keine Aussagen treffen, da Regina nichts mit OS/2 Konventionen zu tun hat.

Ein Beispiel für sensitive Funktionsnamen... (von: GA, 12:56:59)
gibt Merill Callaway in ihrem Buch "The REXX COOKBOOK", 1995,S. 7-3

" For example, the REXXLIB extension DLL from Quercus Systems is registered and all functions loaded with the following two lines in a REXX program:

CALL RxFuncAdd 'RexxLibRegister', 'REXXLIB', 'rexxlibregister'
CALL RexxLibRegister

Note that RxFuncAd, even though it is part of RexxUtil, may also register third party REXX extension functions. RxFuncAdd is the only RexxUtil function that DOES NOT HAVE TO BE REGISTERED before it can be used. The THIRD argument of all RxFuncAdd calls is always case sensitive. Make sure to use exactly as quoted(see above)."

Pruefen ob Funktion geladen? (von: Andreas Schnellbacher, 17:53:21)
Moin GA,

hast Du irgend 'ne Idee, wie man von REXX aus pruefen kann, ob eine Funktion zur Verfuegung steht, bevor man sie ausfuehrt?

Mit RxFuncAdd hab ich die gleichen Erfahrungen gemacht, wie Du sie oben beschrieben hast.

Geht das vielleicht mit call on error oder aehnlich?

29.07.2000
Prüfen, ob Funktion registriert wurde (von: GA, 13:30:25)
Mit der Funktion RxFuncQuery kann man überprüfen, ob eine Funktion oder mehrere schon erfolgreich registriert wurden:

http://www2.hursley.ibm.com/rexxtut/socktut4.htm

Dieses gezeigte Beispiel ist die enfachste Art, die allgemeine Überprüfung von SysLoadFuncs bei der Registrierung der Funktionen von REXXUTIL(klassich) vorzunehemen. Dieses Beipsiel, ist etwas erweitert:

(aus Testgründen setze ich die Argumente in den Klammern in
Anführungszeichen):

IF RxFuncQuery(""SysLoadFuncs") THEN
DO
RC = RxFuncAdd("SyslaodFuncs","RexxUttil","SysLoadFuncs")
IF (RC) THEN DO
SAY "REXX - Funktionen können nicht geladen werden"
EXIT
END
ELSE
CALL SysLoadFuncs
END

Diese Überprüfung kann nun zu jedem Zeitpunkt vor einem EXIT oder RETURN ineinem REXX Programm auch für einzelne Funktionen ausgeführt werden:


/*--------------------------------------*/
/* Register REXX SQL interface */
/*--------------------------------------*/

If Rxfuncquery('SQLDBS')<>0 then do;
rc = RxfuncAdd('SQLDBS','SQLAR','SQLDBS');
if rc <> 0 then do; say 'Error registering SQLDBS'; exit rc; end;
end;
If Rxfuncquery('SQLEXEC')<>0 then do;
rc = RxfuncAdd('SQLEXEC','SQLAR','SQLEXEC');
if rc <> 0 then do; say 'Error registering SQLEXEC'; exit rc; end;
end;
If Rxfuncquery('SysFileDelete')<>0 then do;
rc = RxfuncAdd('SysFileDelete','RexxUtil','SysFileDelete');
if rc <> 0 then do; say 'Error registering SysFileDelete'; exit rc; end;
end;

Quelle:http://d02xdgcl01.southbury.ibm.com/support/tcp/spring99/db2log.html

Re: Prüfen, ob Funktion registriert wurde (von: Andreas Schnellbacher, 20:36:19)
Oha,

die Funktion RxFuncQuery kannte ich noch gar nicht. Schoenen Dank, Gerhard.

In Rexx Tips & Tricks (rxtt30.zip) findet man auch 'ne Menge, wenn man nach RxFuncQuery sucht.

08.08.2000
RxFuncAdd als Subroutine formuliert: (von: GA, 12:06:20)
/* AddRexxUtil procedure */ AddRexxUtil: procedure
parse arg name
if RxFuncQuery( name ) = 0 /* not registered */ then do
if RxFuncAdd( name, 'RexxUtil', name ) = 0 /* not successful */ then do
say 'Unable to register REXX Utility Function' name
return 1 /* failure */
end /* Do */
end /* Do */
return 0 /* success */

Das ganze Programm(sehr elegant zum Lernen!!) findet man hier:

http://www.os2.net/webcol/os2wwc10.html

( Zeige die Threadübersicht ) [ Version zum Drucken ] ( Zur Startübersicht )

Datum Thema
07.01.2017 *

*

Name: * eMail: Benachrichtigung

Mit * markierte Felder müssen ausgefüllt werden !


php.net OpenIT © 1998-2017 by WebTeam OS2.org