|
Sorry it took so long to get back to you. I don't know this level of detail concerting RPG so I asked around trying to find out if character parameters in RPG are passed on the stack or if a pointer is passed. No one answered my question but I would think they would be passed by reference. I would think it would work better if it was pass by reference. Anyone else on the forum know how character parameters are passed in RPG? David Wall AS/400 Toolbox for Java "Price, Chris" <chris_price@nsb.c To: "'JAVA400-L@midrange.com'" <JAVA400-L@midrange.com> o.uk> cc: Sent by: Subject: RE: AS400 Toolbox problems - ServiceProgramCall owner-java400-l@mi drange.com 08/14/2001 10:18 AM Please respond to JAVA400-L Thanks for your example. Unfortunately it didn't work on my system as we don't seem to have a QTOCNETSTS service program. I'm trying to call my own service program, written in RPG IV. The Java class sets the String input parameter to a test value, and calls the procedure. The procedure compares the passed in string to a value, and if the same returns 99, otherwise returns -1. If written as a service program, the return value is always -1. Yet if I convert the service program into a program, making the nessesscary changes to the class, the return value is 99. Here's a sample of my Java & RPG code: public class Temp { public static void main(String[] parameters) { AS400 as400 = new AS400(); QSYSObjectPathName sprogramName = new QSYSObjectPathName("R1005DVOBJ", "CJPTEST", "SRVPGM"); ServiceProgramCall spgm = new ServiceProgramCall(as400); //Service Program Call try { // One Parameter - String in. Returns short ProgramParameter[] parmlist = new ProgramParameter[1]; AS400Text text1 = new AS400Text(10, as400); byte[] text = text1.toBytes("CHRISPRICE"); // parmlist[0] = new ProgramParameter(text); parmlist[0] = new ProgramParameter(); parmlist[0].setInputData(text); parmlist[0].setParameterType(ProgramParameter.PASS_BY_VALUE); //run the serivce program spgm.setProgram(sprogramName.getPath(), parmlist); spgm.setProcedureName("CJPTEST_PROC"); if (spgm.run() != true) { AS400Message[] msgList = spgm.getMessageList(); System.out.println("The program did not run. AS/400 messages:"); for (int i = 0; i < msgList.length; i++) { System.out.println(msgList[i].getText()); } } else { AS400Bin2 as400Int = new AS400Bin2(); byte[] as400Data = spgm.getReturnValue(); short result = as400Int.toShort(as400Data, 0); System.out.println("Service Program Call Result is : " + result); } } catch (Exception e) { System.out.println("Service Program call failed"); System.out.println(e); } System.exit(0); } } The very simple RPG module: D CJPTEST_PROC PR 5I 0 D String 10 Value P CJPTEST_PROC B Export D PI 5I 0 D String 10 Value C If String = 'CHRISPRICE' C Return 99 C Else C Return -1 C Endif -----Original Message----- From: Dave Wall [mailto:dawall@us.ibm.com] Sent: 14 August 2001 15:45 To: JAVA400-L@midrange.com Subject: Re: AS400 Toolbox problems - ServiceProgramCall Here is code to call entry point QtocLstNetIfc in service program QTOCNETSTS. The entry point takes three parameters -- two strings (passed by reference) and the error code. The strings are converted from Unicode to EBCDIC before being sent to the server. When calling programs or service programs, pay particular attention to lengths. The Toolbox client passes data to the program call server who dumps the data in one big buffer. It then passes pointers to that buffer or pulls data out of the buffer when calling the service program. If a length is off the wrong data will be passed, but since all data comes out of one big buffer you may not get a addressing errors (trying to get to memory you don't own). You will just get bad data. Are you trying to call an OS/400 service program or one of your own? Some Toolbox objects are implemented by calling OS/400 service programs via ServiceProgramCall so I know it can work. AS400 system = new AS400(); // The first parm is 20 characters, 10 chars of user space followed by 10 chars of library. // Create a converter for 20 chars. AS400Text char20 = new AS400Text(20, system); // The second parm is the format name (8 chars). Create a converter. AS400Text char8 = new AS400Text(8, system); // Create program parameters ProgramParameter[] parms = new ProgramParameter[3]; // First parm is qualified user space CHAR(20) // CHAR(0-9) is the user space name // CHAR(10-19) is the library name String qSpace = "DAW DAW "; // First parm is the library qualified UserSpace parms[0] = new ProgramParameter(char20.toBytes(qSpace)); parms[0].setParameterType(ProgramParameter.PASS_BY_REFERENCE); // Second parm is the format parms[1] = new ProgramParameter(char8.toBytes("NIFC0100")); parms[1].setParameterType(ProgramParameter.PASS_BY_REFERENCE); // Last parm is the error code. We pass an array of 0x00s so messages are returned. byte[] bytes = new byte[32]; parms[2] = new ProgramParameter(bytes, 32); parms[2].setParameterType(ProgramParameter.PASS_BY_REFERENCE); ServiceProgramCall sPGMCall = null; System.out.println("About to create the program"); sPGMCall = new ServiceProgramCall(system, "/QSYS.LIB/QTOCNETSTS.SRVPGM", "QtocLstNetIfc", ServiceProgramCall.NO_RETURN_VALUE, parms); System.out.println(sPGMCall.run()); AS400Message[] ml = sPGMCall.getMessageList(); for (int i=0; i<ml.length; i++) System.out.println(ml[i].getID() + ": " + ml[i].getText()); David Wall 553-5329 AS/400 Toolbox for Java "Price, Chris" <chris_price@nsb.c To: "'java400-l@midrange.com'" <java400-l@midrange.com> o.uk> cc: Sent by: Subject: AS400 Toolbox problems - ServiceProgramCall owner-java400-l@mi drange.com 08/14/2001 05:31 AM Please respond to JAVA400-L Has anyone successfully managed to call a procedure in a service program, using the ServiceProgramCall class? I'm having major problems getting this to work: Passing by reference doesn't work at all - get null pointer errors in the procedure. Passing by value works for integers, but Strings get garbled. I thought this might be a CCSID problem, but the same code works fine for a ProgramCall. Does anyone have any working examples using this class, there aren't any that I can find in the toolbox documentation. Confused, Chris. =======DISCLAIMER======= This email transmission and any attachments may contain confidential information which is legally privileged. You are also notified that the contents of this email and any which you may send in reply, may be viewed by authorised personnel on behalf of NSB Retail Systems Plc or its subsidiaries (the Company) in accordance with the Company's Information Access Policy. The content of this email is always subject to contract. The information is intended only for the individual or entities to whom it is addressed. If you are not an intended recipient please contact me immediately and you are hereby notified that any disclosure, copying, distribution, storage on any medium or use of the information contained in this transmission is strictly prohibited. +--- | This is the JAVA/400 Mailing List! | To submit a new message, send your mail to JAVA400-L@midrange.com. | To subscribe to this list send email to JAVA400-L-SUB@midrange.com. | To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com. | Questions should be directed to the list owner: joe@zappie.net +--- +--- | This is the JAVA/400 Mailing List! | To submit a new message, send your mail to JAVA400-L@midrange.com. | To subscribe to this list send email to JAVA400-L-SUB@midrange.com. | To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com. | Questions should be directed to the list owner: joe@zappie.net +--- =======DISCLAIMER======= This email transmission and any attachments may contain confidential information which is legally privileged. You are also notified that the contents of this email and any which you may send in reply, may be viewed by authorised personnel on behalf of NSB Retail Systems Plc or its subsidiaries (the Company) in accordance with the Company's Information Access Policy. The content of this email is always subject to contract. The information is intended only for the individual or entities to whom it is addressed. If you are not an intended recipient please contact me immediately and you are hereby notified that any disclosure, copying, distribution, storage on any medium or use of the information contained in this transmission is strictly prohibited. +--- | This is the JAVA/400 Mailing List! | To submit a new message, send your mail to JAVA400-L@midrange.com. | To subscribe to this list send email to JAVA400-L-SUB@midrange.com. | To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com. | Questions should be directed to the list owner: joe@zappie.net +--- +--- | This is the JAVA/400 Mailing List! | To submit a new message, send your mail to JAVA400-L@midrange.com. | To subscribe to this list send email to JAVA400-L-SUB@midrange.com. | To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com. | Questions should be directed to the list owner: joe@zappie.net +---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.