Anmelden

View Full Version : Retrieve Call Stack (QWVRCSTK) API



Seiten : [1] 2

kuempi von stein
20-08-04, 11:12
Hallo,

erst mal schönen tag aus berlin.
ich möchte in einem triggerprogramm (RPG) wissen, welches programm diesen trigger ausgelöst hat.
die einfachste möglichkeit scheint mir den "Retrieve Call Stack (QWVRCSTK) API" aufzurufen...
nur leider kriege ich das absolut nicht gebacken...
hat jemand zufällig nen beispiellisting, möglichst in altem rpg?
als alternative habe ich in den usertools gesucht, aber da ist der rtvpgmstk angeblich seit v3wasweissich nicht mehr bei und nun komme ich nicht weiter...
ach ja, noch was: ein simples wrkjob nach *print und wieder einlesen darf ich wegen performencegründen leider nicht machen...

any ideas? help!

grussle
kuempi

Fuerchau
20-08-04, 11:50
Schau mal unter folgendem Link:
http://www.rlpforen.de/showthread.php?t=1196&goto=nextoldest

kuempi von stein
20-08-04, 12:02
Schau mal unter folgendem Link:
http://www.rlpforen.de/showthread.php?t=1196&goto=nextoldest
danke fuerchau, aber das ist genau das was ich nicht suche...
es sollte wirklich per apicall gehen.
ein cl was ne liste erstellt und die dann eingelesen wird geht leider leider nicht....
mein chef hat diesen weg ausdrücklich verneint.
wenn ich nur den blöden api ansteuern könnte... die doku bei ibm ist unter aller kanone dazu... kann aber auch an mir liegen, habe ewig nicht mehr mit apis gearbeitet..
die links bei ibm helfen auch nicht weiter...
habe irgendwo noch ne redbook cd rumfliegen... mal sehen ob ich da was finde..

*grummel*

in diesen sinne

TARASIK
20-08-04, 12:06
Hallo Kuempi,
vielleicht hilft Dir dies weiter:

quick method to determine the name of the calling program in RPG400

From: "Peter Connell"
Infinitely, IBM has kindly provided us with QWVRCSTK at V5.
Here's a "quickee" I whipped up to prove it.

D GetCaller PR Extpgm('QWVRCSTK')
D 2000
D 10I 0
D 8 CONST
D 56
D 8 CONST
D 15

D Var DS 2000
D BytAvl 10I 0
D BytRtn 10I 0
D Entries 10I 0
D Offset 10I 0
D EntryCount 10I 0
D VarLen S 10I 0 Inz(%size(Var))
D ApiErr S 15

D JobIdInf DS
D JIDQName 26 Inz('*')
D JIDIntID 16
D JIDRes3 2 Inz(*loval)
D JIDThreadInd 10I 0 Inz(1)
D JIDThread 8 Inz(*loval)

D Entry DS 256
D EntryLen 10I 0
D PgmNam 10 Overlay(Entry:25)
D PgmLib 10 Overlay(Entry:35)
D
C CallP GetCaller(Var:VarLen:'CSTK0100':JobIdInf
C :'JIDF0100':ApiErr)
C Do EntryCount
C Eval Entry = %subst(Var:Offset + 1)
C Eval Offset = Offset + EntryLen
C Enddo
C Eval *InLR = *on

Fuerchau
20-08-04, 12:17
Das Problem ist, dass du auf diesem Wege nur das Programm unmittelbar vor dem Trigger bekommst.
Dieses ist allerdings nicht der Auslöser sondern ein Systemprogramm. Schau dir mal mittels Debugger den Callstack genau an, wieviel Programme ggf. noch dazwischen liegen.

kuempi von stein
20-08-04, 12:25
Hallo Kuempi,
vielleicht hilft Dir dies weiter:

hello tarasik,

das sieht mir verdächtig nach ile-rpg aus. werde ich mal vorsichtig eintippen. habe leider keine erfahrungen damit. scheint aber genau das zu sein was ich benötige...
mhh...
hoffe mal, das ich den call zu diesem ile-teil ohne probs in mein olles rpg reinbekomme.
interpretiere ich die source richtig, dass da 10 mal ne schleifwe durchlaufen wird? dann muss ich ergo noch den "richtigen caller" finden und nen parm ans ile-rpg ranhängen, damit ich das zurückgeliefert bekomme was ich suche?
denke mal bis montag oder so kann ich mehr dazu sagen.
ist ca cool wie schnell hier geholfen wird.

oder noch besser, ich finde jemand, der mir das umsetzt von ile nach "oldstyle"-rpg...

es wird echt zeit, dass ich ile-rpg lerne denke ich.
mag jemand nen gutes buch empfehlen?

so long erstmal

kuempi

kuempi von stein
20-08-04, 12:27
Das Problem ist, dass du auf diesem Wege nur das Programm unmittelbar vor dem Trigger bekommst.
Dieses ist allerdings nicht der Auslöser sondern ein Systemprogramm. Schau dir mal mittels Debugger den Callstack genau an, wieviel Programme ggf. noch dazwischen liegen.so schnell kann ich gar nicht tippen wie hier die antworten reinkommen... *lach...
ja das mit dem callstack dachte ich mir schon...

*seufz*

da kommt mir noch eine idee, ich könnte ja das triggerprogramm per call hier in dieses teil einbauen? mmhh...
das hat aber auch 2 parms... dann muss ich die rüberschleifen...
ich merk schon... ist alles komplizierter als geträumt..

kuempi

TARASIK
20-08-04, 12:31
Hallo,
noch ein Beispiel:

http://archive.midrange.com/rpg400-l/200211/msg00386.html

B.Hauser
20-08-04, 13:21
es sollte wirklich per apicall gehen.
ein cl was ne liste erstellt und die dann eingelesen wird geht leider leider nicht....
mein chef hat diesen weg ausdrücklich verneint.


Darfst Du überhaupt kein CL verwenden oder nur keines das eine Liste erstellt?

Mit CL gibt es nämlich einen ganz einfachen Weg das rufende Programm zu ermitteln, über Send/Receive Message.

Hier das CL-Programm, vielleicht hilfts:
P$CALLED wird als Parameter übergeben, und P$CALLER ist das Programm im Call-Stack, für das das rufende Programm ermittelt werden soll.


PGM PARM(&P$CALLER +
&P$CALLED)

DCL VAR(&P$CALLER) TYPE(*CHAR) LEN(10)
DCL VAR(&P$CALLED) TYPE(*CHAR) LEN(10)

DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
DCL VAR(&SENDER) TYPE(*CHAR) LEN(80)

SNDPGMMSG MSG('TEST') TOPGMQ(*PRV (&P$CALLED)) +
MSGTYPE(*RQS) KEYVAR(&MSGKEY)

RCVMSG PGMQ(*PRV (&P$CALLED)) MSGKEY(&MSGKEY) +
SENDER(&SENDER)

CHGVAR VAR(&P$CALLER) VALUE(%SST(&SENDER 56 10))
ENDE: ENDPGM



Birgitta

kuempi von stein
20-08-04, 14:18
Darfst Du überhaupt kein CL verwenden oder nur keines das eine Liste erstellt?
Birgitta

Sodele ...

erst mal vielen Dank an die vielen Helferlein!
Die Variante mit dem CL funktioniert.
Da muss dann natürlich als callendes Programm z.B. QDBPUT gegeben werden, wenn ich den Trigger auf Insert habe.
Wie auch immer, ein SNDPGMMSG mit anschliessenden RCVMSG scheint mir auch nicht ganz so ressourcenfressend zu sein wie eine Ausgabe nach Liste und diese dann einzulesen...
Die ILE-Geschichte hab ich leider nicht auf Anhieb gebacken bekommen. Interessant, aber da muss ich erst mal ein wenig Autodidaktik betreiben...
Aber der Tag hat ja leider nur 24 Stunden... :-))

Also, nochmal ein Dankeschön und schönes WE dann irgendwann...

kuempi