PROPID_M_COMPOUND_MESSAGE

 

Applies To: Windows 10, Windows 7, Windows 8, Windows 8.1, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2, Windows Server Technical Preview, Windows Vista

(Introduced in MSMQ 3.0.) The PROPID_M_COMPOUND_MESSAGE property provides the entire contents of an SRMP message, including both the SOAP envelope and the SOAP attachments associated with it.

Property ID

PROPID_M_COMPOUND_MESSAGE

Type Indicator

VT_VECTOR | VT_UI1

MQPROPVARIANT Field

caub

Property Value

An array of bytes that represents the entire contents of an SRMP message, including both the SOAP envelope and the SOAP attachments (MIME binary attachments) associated with it.

Remarks

The PROPID_M_COMPOUND_MESSAGE property is a read-only property that is used only when an application retrieves SRMP messages. When an SRMP message is sent, the sending queue manager attaches the SOAP attachments, along with the SOAP envelope, to the message.

This property can contain any number of SOAP attachments. It is the responsibility of the receiving application to parse the returned data and process the envelope and the individual attachments to retrieve individual elements. Any XML parser can be used for this purpose.

To retrieve the entire contents of an SRMP message, specify PROPID_M_COMPOUND_MESSAGE_SIZE and PROPID_M_COMPOUND_MESSAGE in the MQMSGPROPS structure. Then, call MQReceiveMessage or MQReceiveMessageByLookupId and examine the returned value.

If MQReceiveMessage or MQReceiveMessageByLookupId fails, returning an MQ_ERROR_BUFFER_OVERFLOW error, use the returned value of PROPID_M_COMPOUND_MESSAGE_SIZE to reallocate the message body buffer and call the applicable function again.

To retrieve the SOAP envelope, use the PROPID_M_SOAP_ENVELOPE property.

To retrieve the message body, which is sent as an attachment in an SRMP message, use the PROPID_M_BODY property.

Equivalent COM Property

With COM components, the equivalent property for retrieving the entire contents of an SRMP message is MSMQMessage.CompoundMessage.

Example Code

The following code fragment shows how PROPID_M_COMPOUND_MESSAGE is specified in arrays that can be used to initialize an MQMSGPROPS structure for retrieving the entire contents of an SRMP message, including both the SOAP envelope and the SOAP attachments associated with it (note that the size of the entire message must be retrieved with the attachments).

aMsgPropID[i] = PROPID_M_COMPOUND_MESSAGE_SIZE;     // Property ID  
aMsgPropVar[i].vt = VT_UI4;                         // Type indicator  
i++;  
  
ULONG ulMsgBufferSize = 4096;  
UCHAR * pucMsgBuffer = NULL;  
pucMsgBuffer = (UCHAR *)malloc(ulMsgBufferSize);  
if (pucMsgBuffer == NULL)  
{  
  return MQ_ERROR_INSUFFICIENT_RESOURCES;  
}  
memset(pucMsgBuffer, 0, ulMsgBufferSize);  
aMsgPropID[i] = PROPID_M_COMPOUND_MESSAGE;          // Property ID  
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;             // Type indicator  
aMsgPropVar[i].caub.pElems = (UCHAR*)pucMsgBuffer;  
aMsgPropVar[i].caub.cElems = ulMsgBufferSize;  
i++;  
  
// Reallocate memory for the message buffer if necessary.  
ulMsgBufferSize = aMsgPropVar[0].ulVal*sizeof(UCHAR);  
pucMsgBuffer = (UCHAR*)realloc(pucMsgBuffer, ulMsgBufferSize);  
if (pucMsgBuffer == NULL)  
{  
  return MQ_ERROR_INSUFFICIENT_RESOURCES;  
}  
memset(pucMsgBuffer, 0, ulMsgBufferSize);  
aMsgPropVar[1].caub.pElems = (UCHAR*)pucMsgBuffer;  // Pointer to the new buffer  
aMsgPropVar[1].caub.cElems = ulMsgBufferSize;       // New buffer size  

See Also

Message Properties
MQMSGPROPS
MSMQMessage.CompoundMessage
PROPID_M_COMPOUND_MESSAGE_SIZE
PROPID_M_BODY
PROPID_M_SOAP_ENVELOPE