When reading messages synchronously, all calls are blocked until the next message is available or timeout occurs.
hr = MQOpenQueue(
szwFormatNameBuffer, // Format name of the queue.
MQ_RECEIVE_ACCESS, // Access rights to the Queue.
0, // No receive Exclusive.
&hQueue // OUT: handle to the opened Queue.
);
//Set the message body property.
aPropId[PropIdCount] = PROPID_M_BODY; //PropId
aVariant[PropIdCount].vt = VT_VECTOR|VT_UI1; //Type
aVariant[PropIdCount].caub.cElems = MSG_BODY_LEN; //Buffer size
aVariant[PropIdCount].caub.pElems = ucMsgBody; //Buffer
PropIdCount++;
// Set the MQMSGPROPS structure.
MsgProps.cProp = PropIdCount; //Number of properties.
MsgProps.aPropID = aPropId; //Ids of properties.
MsgProps.aPropVar = aVariant; //Values of properties.
MsgProps.aStatus = NULL; //No Error report.
hr = MQReceiveMessage(
hQueue, // Handle to the Queue.
5 * 60 * 1000, // Timeout value (msec) to wait for
// messages (5*60*1000=5 min.).
MQ_ACTION_RECEIVE, // Action.
&MsgProps, // Properties to retrieve.
NULL, // Must be NULL for synchronous receive.
NULL, // Must be NULL for synchronous receive.
NULL, // No Cursor.
MQ_NO_TRANSACTION // No transaction.
);
The following example opens a queue with receive access, specifies the body of the message as the only property to be retrieved, and then reads the first message in the queue as a non-transactional, synchronous operation.
HRESULT hr
//Open Queue
WCHAR * szwFormatNameBuffer; // Format Name of the queue to be opened
QUEUEHANDLE hQueue;
// Obtain format name of queue.
hr = MQOpenQueue(
szwFormatNameBuffer, // Format Name of the queue to be opened.
MQ_RECEIVE_ACCESS, // Access rights to the Queue.
0, // No receive Exclusive.
&hQueue // OUT: handle to the opened Queue.
);
if (FAILED(hr))
{
// Error handler for MQOpenQueue.
}
MQMSGPROPS MsgProps;
MQPROPVARIANT aVariant[10];
MSGPROPID aPropId[10];
DWORD PropIdCount = 0;
//
// Prepare the message properties to be retrieved.
//
#define MSG_BODY_LEN 500
unsigned char ucMsgBody[MSG_BODY_LEN];
// Set the PROPID_M_BODY property.
aPropId[PropIdCount] = PROPID_M_BODY; //PropId
aVariant[PropIdCount].vt = VT_VECTOR|VT_UI1; //Type
aVariant[PropIdCount].caub.cElems = MSG_BODY_LEN; //Buffer size.
aVariant[PropIdCount].caub.pElems = ucMsgBody; //Buffer
PropIdCount++;
//
// Set other properties.
//
// Set the MQMSGPROPS structure
MsgProps.cProp = PropIdCount; //Number of properties.
MsgProps.aPropID = aPropId; //Ids of properties.
MsgProps.aPropVar = aVariant; //Values of properties.
MsgProps.aStatus = NULL; //No Error report.
//
// Retrieve the message.
//
hr = MQReceiveMessage(
hQueue, // handle to the Queue.
5 * 60 * 1000, // Timeout value (msec) to wait for
// for messages (5*60*1000=5 min.).
MQ_ACTION_RECEIVE, // Action.
&MsgProps, // properties to retrieve.
NULL, // No overlapped structure.
NULL, // No callback function.
NULL, // No Cursor.
MQ_NO_TRANSACTION // No transaction
);
if (FAILED(hr))
{
// Error handler for MQReceiveMessage.
}