F
Fuelfire
Guest
I solved this problem. The reason was StruсtId parameter. It must be initialized as follows: ASSIGN CharString = "OD ". instead "ODbb" as described in the MQ API manual. This is the final version (does not work MQGET and MQPUT yet). I hope this example will help someone else.[
] /*Usual sequence is: MQ Connect (queue manager name) MQ Open (queue name) MQ Put / Get (message) MQ Close (q) MQ Disconnect (qm) */ &SCOPED-DEFINE MQCC_OK 0 &SCOPED-DEFINE MQRC_NONE 0 &SCOPED-DEFINE MQOO_INPUT_EXCLUSIVE 4 &SCOPED-DEFINE MQOO_OUTPUT 16 &SCOPED-DEFINE MaxMsgLength 104 857 600 &SCOPED-DEFINE DLL-LIB mqic32.dll &SCOPED-DEFINE MQCO_NONE 0 DEFINE VARIABLE QMgrName AS CHAR FORMAT "X(48)" NO-UNDO. /*Name of queue manager*/ DEFINE VARIABLE AlternateUserId AS CHAR FORMAT "X(12)" NO-UNDO. /*Alternate user identifier.*/ DEFINE VARIABLE ObjectRecPtr AS MEMPTR NO-UNDO. DEFINE VARIABLE ResponseRecPtr AS MEMPTR NO-UNDO. DEFINE VARIABLE CharString AS CHARACTER. DEFINE VARIABLE StrLength AS INT. DEFINE VARIABLE Hconn AS INT64 NO-UNDO. /* Connection handle */ DEFINE VARIABLE CompCode AS INT64 NO-UNDO. /* Completion code */ DEFINE VARIABLE Reason AS INT64 NO-UNDO. /* Reason code qualifying CompCode */ DEFINE VARIABLE ObjDesc AS MEMPTR NO-UNDO. DEFINE VARIABLE Hobj AS INT NO-UNDO. DEFINE VARIABLE MsgDesc AS MEMPTR NO-UNDO. DEFINE VARIABLE GetMsgOpts AS MEMPTR NO-UNDO. DEFINE VARIABLE PutMsgOpts AS MEMPTR NO-UNDO. DEFINE VARIABLE Buffer_ AS CHAR NO-UNDO. /*Area to contain the message data*/ DEFINE VARIABLE DataLength AS INT NO-UNDO. /*connecting to queue manager*/ PROCEDURE MQCONN EXTERNAL "{&DLL-LIB}" CDECL PERSISTENT: DEFINE INPUT PARAMETER QName AS CHAR NO-UNDO. /*Name of queue manager*/ DEFINE OUTPUT PARAMETER Hconn AS LONG NO-UNDO. /*Connection handle*/ DEFINE OUTPUT PARAMETER CompCode AS LONG NO-UNDO. /*Completion code: MQCC_OK - Successful completion.*/ DEFINE OUTPUT PARAMETER Reason AS LONG NO-UNDO. /*Reason code qualifying CompCode*/ END PROCEDURE. /*opening the queue*/ PROCEDURE MQOPEN EXTERNAL "{&DLL-LIB}" CDECL PERSISTENT: DEFINE INPUT PARAMETER Hconn AS LONG NO-UNDO. /*Connection handle*/ DEFINE INPUT-OUTPUT PARAMETER ObjDesc AS MEMPTR NO-UNDO. /*Object descriptor*/ DEFINE INPUT PARAMETER OPTIONS_ AS LONG NO-UNDO. /*Options that control the action of MQOPEN*/ DEFINE OUTPUT PARAMETER Hobj AS LONG NO-UNDO. /*Object handle - õýíäë î÷åðåäè*/ DEFINE OUTPUT PARAMETER CompCode AS LONG NO-UNDO. /*Completion code*/ DEFINE OUTPUT PARAMETER Reason AS LONG NO-UNDO. /*Reason code qualifying CompCode*/ END PROCEDURE. /*getting the message from queue*/ PROCEDURE MQGET EXTERNAL "{&DLL-LIB}" CDECL PERSISTENT: DEFINE INPUT PARAMETER Hconn AS LONG NO-UNDO. /*Connection handle*/ DEFINE INPUT PARAMETER Hobj AS LONG NO-UNDO. /*Object handle - õýíäë î÷åðåäè*/ DEFINE INPUT-OUTPUT PARAMETER MsgDesc AS MEMPTR NO-UNDO. /*message descriptor*/ DEFINE INPUT-OUTPUT PARAMETER GetMsgOpts AS MEMPTR NO-UNDO. /*Options that control the action of MQGET*/ DEFINE INPUT PARAMETER BufferLength AS LONG NO-UNDO. /*Length in bytes of the Buffer area*/ DEFINE OUTPUT PARAMETER Buffer_ AS CHAR NO-UNDO. /*Area to contain the message data*/ DEFINE OUTPUT PARAMETER DataLength AS LONG NO-UNDO. /*Length of the message*/ DEFINE OUTPUT PARAMETER CompCode AS LONG NO-UNDO. /*Completion code*/ DEFINE OUTPUT PARAMETER Reason AS LONG NO-UNDO. /*Reason code qualifying CompCode*/ END PROCEDURE. /*putting the message in queue*/ PROCEDURE MQPUT EXTERNAL "{&DLL-LIB}" CDECL PERSISTENT: DEFINE INPUT PARAMETER Hconn AS LONG NO-UNDO. /*Connection handle*/ DEFINE INPUT PARAMETER Hobj AS LONG NO-UNDO. /*Object handle - õýíäë î÷åðåäè*/ DEFINE INPUT-OUTPUT PARAMETER MsgDesc AS MEMPTR NO-UNDO. /*message descriptor*/ DEFINE INPUT-OUTPUT PARAMETER PutMsgOpts AS MEMPTR NO-UNDO. /*Options that control the action of MQPUT*/ DEFINE INPUT PARAMETER BufferLength AS LONG NO-UNDO. /*Length in bytes of the Buffer area*/ DEFINE INPUT PARAMETER Buffer_ AS CHAR NO-UNDO. /*Area to contain the message data*/ DEFINE OUTPUT PARAMETER CompCode AS LONG NO-UNDO. /*Completion code*/ DEFINE OUTPUT PARAMETER Reason AS LONG NO-UNDO. /*Reason code qualifying CompCode*/ END PROCEDURE. /*closing the queue*/ PROCEDURE MQCLOSE EXTERNAL "{&DLL-LIB}" CDECL PERSISTENT: DEFINE INPUT PARAMETER Hconn AS LONG NO-UNDO. /*Connection handle*/ DEFINE INPUT-OUTPUT PARAMETER Hobj AS LONG NO-UNDO. /*Object handle - õýíäë î÷åðåäè*/ DEFINE INPUT PARAMETER OPTIONS_ AS LONG NO-UNDO. /*Options that control the action of MQCLOSE*/ DEFINE OUTPUT PARAMETER CompCode AS LONG NO-UNDO. /*Completion code*/ DEFINE OUTPUT PARAMETER Reason AS LONG NO-UNDO. /*Reason code qualifying CompCode*/ END PROCEDURE. /*disconnecting from queue manager*/ PROCEDURE MQDISC EXTERNAL "{&DLL-LIB}" CDECL PERSISTENT: DEFINE INPUT-OUTPUT PARAMETER Hconn AS LONG. /*Connection handle*/ DEFINE OUTPUT PARAMETER CompCode AS LONG. /*Completion code*/ DEFINE OUTPUT PARAMETER Reason AS LONG. /*Reason code qualifying CompCode*/ END PROCEDURE. ASSIGN QMgrName = "UNIQM" AlternateUserId = "extmqusr". /*Connect to certain queue manager*/ RUN MQCONN (QMgrName, OUTPUT Hconn, OUTPUT CompCode, OUTPUT Reason). IF ((CompCode = {&MQCC_OK} ) AND (Reason = {&MQRC_NONE})) THEN DO: MESSAGE "+++ MQCONN() ended OK!" VIEW-AS ALERT-BOX. END. ELSE DO: /* report reason and exit */ MESSAGE "--- MQCONN() ended with Completion Code " (IF CompCode = -1 THEN "MQCC_UNKNOWN" ELSE (IF CompCode = 0 THEN "MQCC_OK" ELSE (IF CompCode = 1 THEN "MQCC_WARNING" ELSE "MQCC_FAILED"))) "~nReason code " STRING(Reason) VIEW-AS ALERT-BOX. IF Reason <> 2002 THEN LEAVE. END. SET-SIZE(ObjDesc) = 350. SET-SIZE(ObjectRecPtr) = 4. SET-SIZE(ResponseRecPtr) = 4. ASSIGN CharString = "OD " /*StructId (MQCHAR4), 4-byte: MQOD_STRUC_ID*/ StrLength = LENGTH(CharString). PUT-STRING(ObjDesc,1) = CharString. PUT-LONG(ObjDesc,StrLength + 1) = 1. /*Version (MQLONG), 4-byte: MQOD_VERSION_1*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = 1. /*ObjectType (MQLONG), 4-byte: MQOT_Q*/ ASSIGN StrLength = StrLength + 4 CharString = "TEST.Q". PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*ObjectName (MQCHAR48), 48-byte*/ ASSIGN StrLength = StrLength + 48 CharString = "". PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*ObjectQMgrName (MQCHAR48), 48-byte*/ ASSIGN StrLength = StrLength + 48 CharString = "AMQ.*". PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*DynamicQName (MQCHAR48), 48-byte*/ ASSIGN StrLength = StrLength + 48 CharString = AlternateUserId. PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*AlternateUserId (MQCHAR12), 12-byte*/ ASSIGN StrLength = StrLength + 12. PUT-LONG(ObjDesc,StrLength + 1) = 0. /*RecsPresent (MQLONG), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = 0. /*KnownDestCount (MQLONG), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = 0. /*UnknownDestCount (MQLONG), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = 0. /*InvalidDestCount (MQLONG), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = 0. /*ObjectRecOffset (MQLONG), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = 0. /*ResponseRecOffset (MQLONG), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = GET-POINTER-VALUE(ObjectRecPtr). /*ObjectRecPtr (MQPTR), 4-byte*/ ASSIGN StrLength = StrLength + 4. PUT-LONG(ObjDesc,StrLength + 1) = GET-POINTER-VALUE(ResponseRecPtr). /*ResponseRecPtr (MQPTR), 4-byte*/ ASSIGN StrLength = StrLength + 4 CharString = "". PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*AlternateSecurityId (MQBYTE40), 40-byte: MQSID_NONE*/ ASSIGN StrLength = StrLength + 40 CharString = "". PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*ResolvedQName (MQCHAR48), 48-byte*/ ASSIGN StrLength = StrLength + 48 CharString = "". PUT-STRING(ObjDesc,StrLength + 1) = CharString. /*ResolvedQMgrName (MQCHAR48), 48-byte*/ /*Open a query*/ RUN MQOPEN (HConn, INPUT-OUTPUT ObjDesc, /*{&MQOO_INPUT_EXCLUSIVE},*/ {&MQOO_OUTPUT}, OUTPUT Hobj, OUTPUT CompCode, OUTPUT Reason). IF ((CompCode = {&MQCC_OK} ) AND (Reason = {&MQRC_NONE})) THEN DO: MESSAGE "+++ MQOPEN() ended OK!" VIEW-AS ALERT-BOX. END. ELSE DO: /* report reason and exit */ MESSAGE "--- MQOPEN() ended with Completion Code " (IF CompCode = -1 THEN "MQCC_UNKNOWN" ELSE (IF CompCode = 0 THEN "MQCC_OK" ELSE (IF CompCode = 1 THEN "MQCC_WARNING" ELSE "MQCC_FAILED"))) "~nReason code " STRING(Reason) VIEW-AS ALERT-BOX. RUN ClearMem. RUN MQDISC(INPUT-OUTPUT HConn, OUTPUT CompCode, OUTPUT Reason). IF ((CompCode = {&MQCC_OK} ) AND (Reason = {&MQRC_NONE})) THEN DO: MESSAGE "+++ MQDISC() ended OK!" VIEW-AS ALERT-BOX. END. ELSE DO: /* report reason and exit */ MESSAGE "--- MQDISC() ended with Completion Code " (IF CompCode = -1 THEN "MQCC_UNKNOWN" ELSE (IF CompCode = 0 THEN "MQCC_OK" ELSE (IF CompCode = 1 THEN "MQCC_WARNING" ELSE "MQCC_FAILED"))) "~nReason code " STRING(Reason) VIEW-AS ALERT-BOX. END. LEAVE. END. /*Put the message in queue RUN MQPUT (HConn, Hobj, INPUT-OUTPUT MsgDesc, INPUT-OUTPUT PutMsgOpts, Buffer_, DataLength, OUTPUT CompCode, OUTPUT Reason). */ /* /*Get a message from queue*/ RUN MQGET (HConn, Hobj, INPUT-OUTPUT MsgDesc, INPUT-OUTPUT GetMsgOpts, {&MaxMsgLength}, OUTPUT Buffer_, OUTPUT DataLength, OUTPUT CompCode, OUTPUT Reason). */ /*Close the queue*/ RUN MQCLOSE(HConn, INPUT-OUTPUT Hobj, {&MQCO_NONE}, OUTPUT CompCode, OUTPUT Reason). IF ((CompCode = {&MQCC_OK} ) AND (Reason = {&MQRC_NONE})) THEN DO: MESSAGE "+++ MQCLOSE() ended OK!" VIEW-AS ALERT-BOX. END. ELSE DO: /* report reason and exit */ MESSAGE "--- MQCLOSE() ended with Completion Code " (IF CompCode = -1 THEN "MQCC_UNKNOWN" ELSE (IF CompCode = 0 THEN "MQCC_OK" ELSE (IF CompCode = 1 THEN "MQCC_WARNING" ELSE "MQCC_FAILED"))) "~nReason code " STRING(Reason) VIEW-AS ALERT-BOX. RUN ClearMem. LEAVE. END. /*Disconnect from queue manager*/ RUN MQDISC(INPUT-OUTPUT HConn, OUTPUT CompCode, OUTPUT Reason). IF ((CompCode = {&MQCC_OK} ) AND (Reason = {&MQRC_NONE})) THEN DO: MESSAGE "+++ MQDISC() ended OK!" VIEW-AS ALERT-BOX. END. ELSE DO: /* report reason and exit */ MESSAGE "--- MQDISC() ended with Completion Code " (IF CompCode = -1 THEN "MQCC_UNKNOWN" ELSE (IF CompCode = 0 THEN "MQCC_OK" ELSE (IF CompCode = 1 THEN "MQCC_WARNING" ELSE "MQCC_FAILED"))) "~nReason code " STRING(Reason) VIEW-AS ALERT-BOX. RUN ClearMem. LEAVE. END. RUN ClearMem. PROCEDURE ClearMem: SET-SIZE(ObjDesc) = 0. SET-SIZE(ObjectRecPtr) = 0. SET-SIZE(ResponseRecPtr) = 0. END PROCEDURE.
Continue reading...
Continue reading...