To send a private message , the sending application must set the privacy level of the message. Once the privacy level is set, the functions used to send the message are no different from those used to send other messages. When sending (and receiving) private messages, the application has no part in encrypting (or decrypting) the message.
Note For information on how MSMQ encrypts and decrypts messages, see Private Messages.
To send a private messageWCHAR szFormatName[128];
DWORD dwFormatNameLen = sizeof(szFormatName) / sizeof(WCHAR);
hr = MQPathNameToFormatName(L"dest_machine\\secrets",
szFormatName,
&dwFormatNameLen);
QUEUEHANDLE hQueue;
hr = MQOpenQueue(szFormatName, MQ_SEND_ACCESS, 0, &hQueue);
#define NMSGPROPS 10
MSGPROPID aMsgPropId[NMSGPROPS];
MQPROPVARIANT aMsgPropVar[NMSGPROPS];
HRESULT aMsgStatus[NMSGPROPS];
MQMSGPROPS MsgProps;
DWORD PropIdCount = 0;
//Set PROPID_M_LABEL
aMsgPropId[PropIdCount] = PROPID_M_LABEL; //PropId
aMsgPropVar[PropIdCount].vt = VT_LPWSTR; //Type
aMsgPropVar[PropIdCount].pwszVal = L"Hash hash"; //Value
PropIdCount++
//Set PROPID_M_BODY
#define MESSAGE_BODY L"Secret matters"
aMsgPropId[PropIdCount] = PROPID_M_BODY; //PropId
aMsgPropVar[PropIdCount].vt = VT_VECTOR | VT_UI1;
aMsgPropVar[PropIdCount].caub.pElems = (LPBYTE)MESSAGE_BODY;
aMsgPropVar[PropIdCount].caub.cElems = sizeof(MESSAGE_BODY);
PropIdCount++
//Set PROPID_M_PRIV_LEVEL
aMsgPropId[PropIdCount] = PROPID_M_PRIV_LEVEL; //PropId
aMsgPropVar[PropIdCount].vt = VT_UI4; //Type
aMsgPropVar[PropIdCount].ulVal = MQMSG_PRIV_LEVEL_BODY;
PropIdCount++
//Optional. Set PROPID_M_ENCRYPTION_ALG.
aMsgPropId[PropIdCount] = PROPID_M_ENCRYPTION_ALG; //PropId
aMsgPropVar[PropIdCount].vt = VT_UI4; //Type
aMsgPropVar[PropIdCount].ulVal = CALG_RC4; //Default is RC2.
PropIdCount++
//Set the MQMSGPROPS structure.
MsgProps.cProp = PropIdCount; //Number of properties.
MsgProps.aPropID = aMsgPropId; //Id of properties.
MsgProps.aPropVar = aMsgVariant; //Value of properties.
MsgProps.aStatus = aMsgStatus; //Error report.
hr = MQSendMessage(hQueue, &MsgProps, NULL);
hr = MQCloseQueue(hQueue);
This example starts with a known pathname for the destination queue, translates the pathname to a format name, opens the destination queue with send access, sets the properties of the message (including the privacy level of the message), then sends the message to the destination queue.
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <mq.h>
int main(int argc, char *argv[])
{
HRESULT hr;
//////////////////////////
// Get the format name of
// the destination queue.
//////////////////////////
WCHAR szFormatName[128];
DWORD dwFormatNameLen = sizeof(szFormatName) / sizeof(WCHAR);
hr = MQPathNameToFormatName(L"dest_machine\\secrets",
szFormatName,
&dwFormatNameLen);
if (FAILED(hr))
{
fprintf(stderr, "Failed in MQPathNameToFormatName, error = 0x%x\n", hr);
return -1;
}
//////////////////////////////
// Open the destination queue
// with send access.
//////////////////////////////
QUEUEHANDLE hQueue;
hr = MQOpenQueue(szFormatName, MQ_SEND_ACCESS, 0, &hQueue);
if (FAILED(hr))
{
fprintf(stderr, "Failed in MQOpenQueue, error = 0x%x\n", hr);
return -1;
}
////////////////////////////////////
// Define the MQMSGPROPS structure.
////////////////////////////////////
#define NMSGPROPS 10
MSGPROPID aMsgPropId[NMSGPROPS];
MQPROPVARIANT aMsgPropVar[NMSGPROPS];
HRESULT aMsgStatus[NMSGPROPS];
MQMSGPROPS MsgProps;
DWORD PropIdCount = 0;
//Set PROPID_M_LABEL
aMsgPropId[PropIdCount] = PROPID_M_LABEL; //PropId
aMsgPropVar[PropIdCount].vt = VT_LPWSTR; //Type
aMsgPropVar[PropIdCount].pwszVal = L"Hash hash"; //Value
PropIdCount++
//Set PROPID_M_BODY
#define MESSAGE_BODY L"Secret matters"
aMsgPropId[PropIdCount] = PROPID_M_BODY; //PropId
aMsgPropVar[PropIdCount].vt = VT_VECTOR | VT_UI1;
aMsgPropVar[PropIdCount].caub.pElems = (LPBYTE)MESSAGE_BODY;
aMsgPropVar[PropIdCount].caub.cElems = sizeof(MESSAGE_BODY);
PropIdCount++
//Set PROPID_M_PRIV_LEVEL
aMsgPropId[PropIdCount] = PROPID_M_PRIV_LEVEL; //PropId
aMsgPropVar[PropIdCount].vt = VT_UI4; //Type
aMsgPropVar[PropIdCount].ulVal = MQMSG_PRIV_LEVEL_BODY;
PropIdCount++
//Optional. Set PROPID_M_ENCRYPTION_ALG.
aMsgPropId[PropIdCount] = PROPID_M_ENCRYPTION_ALG; //PropId
aMsgPropVar[PropIdCount].vt = VT_UI4; //Type
aMsgPropVar[PropIdCount].ulVal = CALG_RC4; //Default is RC2.
PropIdCount++
//Set the MQMSGPROPS structure.
MsgProps.cProp = PropIdCount; //Number of properties.
MsgProps.aPropID = aMsgPropId; //Id of properties.
MsgProps.aPropVar = aMsgVariant; //Value of properties.
MsgProps.aStatus = aMsgStatus; //Error report.
///////////////////
// Send the message
///////////////////
hr = MQSendMessage(hQueue, &MsgProps, NULL);
if (FAILED(hr))
{
fprint(stderr, "Failed in MQSendMessage, error = 0x%x\n", hr);
return -1;
}
////////////////////
// Close the queue.
///////////////////
MQCloseQueue(hQueue);
if (FAILED(hr))
{
fprintf(stderr, "Failed in MQCloseQueue, error = 0x%x\n", hr);
return -1;
}
printf("The private message was sent successfully\n");
return 0;
}