C-C++ Code Example: Enforcing Target Journaling
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
This example provides an application-defined function that creates a queue which enforces target journaling. Target journaling is enforced by setting the PROPID_Q_JOURNAL property of the destination queue to MQ_JOURNAL.
Note
The PROPID_Q_JOURNAL property can be set when the queue is created or later. For an example of setting the journaling level of an existing destination queue, see C/C++ Code Example: Setting PROPID_Q_JOURNAL.
In addition to setting the journaling level of the destination queue, this function also sets the PROPID_Q_JOURNAL_QUOTA property to specify the maximum size of the journal queue.
To enforce target journaling
Define an MQQUEUEPROPS structure.
Specify the queue properties. This example specifies PROPID_Q_PATHNAME, which is required to create the queue, PROPID_Q_LABEL, PROPID_Q_JOURNAL, which is required to set the journaling level, and PROPID_Q_JOURNAL_QUOTA, which sets the maximum size of the queue journal.
Initialize the MQQUEUEPROPS structure.
Call MQCreateQueue to create the queue.
Code Example
The following code example can be run on all versions of Message Queuing.
HRESULT EnforceTargetJournaling(
LPWSTR wszPathName,
ULONG ulJournalQuota
)
{
// Define the maximum number of queue properties.
const int NUMBEROFPROPERTIES = 4;
// Define a queue property structure and the structures needed to initialize it.
MQQUEUEPROPS QueueProps;
MQPROPVARIANT aQueuePropVar[NUMBEROFPROPERTIES];
QUEUEPROPID aQueuePropId[NUMBEROFPROPERTIES];
HRESULT aQueueStatus[NUMBEROFPROPERTIES];
HRESULT hr = MQ_OK;
// Validate the input string.
if (wszPathName == NULL)
{
return MQ_ERROR_INVALID_PARAMETER;
}
// Set queue properties.
DWORD cPropId = 0;
aQueuePropId[cPropId] = PROPID_Q_PATHNAME;
aQueuePropVar[cPropId].vt = VT_LPWSTR;
aQueuePropVar[cPropId].pwszVal = wszPathName;
cPropId++;
WCHAR wszLabel[MQ_MAX_Q_LABEL_LEN] = L"Journaling enforced";
aQueuePropId[cPropId] = PROPID_Q_LABEL;
aQueuePropVar[cPropId].vt = VT_LPWSTR;
aQueuePropVar[cPropId].pwszVal = wszLabel;
cPropId++;
aQueuePropId[cPropId] = PROPID_Q_JOURNAL;
aQueuePropVar[cPropId].vt = VT_UI1;
aQueuePropVar[cPropId].bVal = MQ_JOURNAL;
cPropId++;
aQueuePropId[cPropId] = PROPID_Q_JOURNAL_QUOTA;
aQueuePropVar[cPropId].vt = VT_UI4;
aQueuePropVar[cPropId].ulVal = ulJournalQuota;
cPropId++;
// Initialize the MQQUEUEPROPS structure.
QueueProps.cProp = cPropId; //Number of properties
QueueProps.aPropID = aQueuePropId; //IDs of the queue properties
QueueProps.aPropVar = aQueuePropVar; //Values of the queue properties
QueueProps.aStatus = aQueueStatus; //Pointer to the return status
// Call MQCreateQueue to create the queue.
WCHAR wszFormatNameBuffer[256];
DWORD dwFormatNameBufferLength = sizeof(wszFormatNameBuffer)/sizeof(wszFormatNameBuffer[0]);
hr = MQCreateQueue(NULL, // Default security descriptor
&QueueProps, // Address of queue property structure
wszFormatNameBuffer, // Pointer to format name buffer
&dwFormatNameBufferLength); // Pointer to receive the queue's format name length
if (FAILED (hr))
{
return hr;
}
wprintf(L"The queue %s, which saves a copy of all messages removed from it, was created.\n", wszPathName);
return hr;
}