Pointer to Pointer passing to an api.

Chris Schippers

New Member
I have the following api call I have to make, but I am not sure how to translate it to Progress.

BOOL WINAPI SSubmitJob (
TCHAR *Host, // pointer to host
TCHAR *Port, // pointer to port
TCHAR *JobID, // pointer to Job Identifier BOOL Sync, // wait for request to finish
TCHAR **Parameters, // parameter list
TCHAR *Result, // buffer for result text int Length, // size of buffer
void (*Progress) (TCHAR *) // call-back for progress messages
);

Everything works fine as long as I don't send any parameters. As soon as I put a value in the parameters, Progress crashes.

My question, how should I define and pass the TCHAR **Parameters?
The manual say's the following:
Pointer to a null-terminated list of string pointers. Every string pointer in this list points to a parameter that is passed with the job to ITP/DS.


Here is how the program I wrote looks like..

DEF VAR vRESULT AS CHAR.
DEF VAR vLENGTH AS INT.
DEF VAR vPROG AS CHAR.

ASSIGN vRESULT = FILL(" ",256)
vPROG = FILL(" ",256).

PROCEDURE SSubmitJobA EXTERNAL "c:\sock_api.dll":
DEF INPUT PARAMETER iHOST AS CHAR.
DEF INPUT PARAMETER iPORT AS CHAR.
DEF INPUT PARAMETER iJOB AS CHAR.
DEF INPUT PARAMETER iSYNC AS LONG.
DEF INPUT PARAMETER iPARAM AS CHAR.
DEF OUTPUT PARAMETER oRESULT AS CHAR.
DEF OUTPUT PARAMETER oLENGTH AS LONG.
DEF OUTPUT PARAMETER oPROG AS CHAR.
END PROCEDURE.


RUN SSubmitJobA
("s210", /* Host */
"3333", /* Port */
"", /* JobID */
0, /* Sync */
"c:\ccs\chris.xml", /* Parameter */
OUTPUT vRESULT, /* Result */
OUTPUT vLENGTH, /* Length */
OUTPUT vPROG). /* Prog */
 

M-HT

Member
Hi Chris,
something like this should do the trick:

DEF VAR vRESULT AS CHAR.
DEF VAR vLENGTH AS INT.
DEF VAR vPROG AS CHAR.
DEF VAR vPARAM1 AS CHAR.
DEF VAR vPARAM AS MEMPTR.
DEF VAR vTEMP AS MEMPTR.

ASSIGN vRESULT = FILL(" ",256)
vPROG = FILL(" ",256).

PROCEDURE SSubmitJobA EXTERNAL "c:\sock_api.dll":
DEF INPUT PARAMETER iHOST AS CHAR.
DEF INPUT PARAMETER iPORT AS CHAR.
DEF INPUT PARAMETER iJOB AS CHAR.
DEF INPUT PARAMETER iSYNC AS LONG.
DEF INPUT PARAMETER iPARAM AS LONG.
DEF OUTPUT PARAMETER oRESULT AS CHAR.
DEF OUTPUT PARAMETER oLENGTH AS LONG.
DEF OUTPUT PARAMETER oPROG AS CHAR.
END PROCEDURE.

vPARAM1 = "c:\ccs\chris.xml".
SET-SIZE(vPARAM) = LENGTH(vPARAM1) + 1.
SET-SIZE(vTEMP) = 8.
PUT-STRING(vPARAM, 1) = vParam1.
PUT-BYTE(vPARAM, LENGTH(vPARAM1) + 1) = 0.
PUT-LONG(vTEMP, 1) = GET-POINTER-VALUE(vPARAM).
PUT-LONG(vTEMP, 5) = 0.

RUN SSubmitJobA
("s210", /* Host */
"3333", /* Port */
"", /* JobID */
0, /* Sync */
GET-POINTER-VALUE(vTEMP), /* Parameter */
OUTPUT vRESULT, /* Result */
OUTPUT vLENGTH, /* Length */
OUTPUT vPROG). /* Prog */

SET-SIZE(vPARAM) = 0.
SET-SIZE(vTEMP) = 0.
 

M-HT

Member
No, because when the parameter is character or it's an output paramater Progress automatically passes pointer to the variable instead of the variable itself.
 

Chris Schippers

New Member
You' the Man

It is working!
I still have to figure out what you did that made it work, but I must say that I would not have figured it out myself this fast.

Thanks a lot Roman
 

M-HT

Member
Hi Chris,
what I did was that I stored a copy of the required parameter somewhere where I can get a pointer to it (memptr), then I stored the pointer somewhere where I can get a pointer to it, made it a null terminated list and passed the second pointer to the function - pointer to list of pointers. (probably best would be to read the help - there you can get a few pointers :) yourself as what to do)
 
Top