Retrieving PROPID_Q_TRANSACTION

The queue's transaction level specifies whether the queue accepts transaction messages or non-transaction messages. It cannot accept both. By default, a queue is created as a non-transaction queue.

Unlike most queue properties, PROPID_Q_TRANSACTION can be set only when the queue is created.

To retrieve PROPID_Q_TRANSACTION
  1. Define the structures needed to retrieve the properties. This includes the MQQUEUEPROPS structure.
    // Define number of properties to be retrieved.
    #define NumberOfProperties 1
    
    // Define property counter.
    DWORD PropIdCount = 0;
    
    // Define the MQQUEUPROPS structure.
    MQQUEUEPROPS QueueProps;
    PROPVARIANT aQueuePropVar[NumberOfProperties];
    QUEUEPROPID aQueuePropId[NumberOfProperties];
    HRESULT aQueueStatus[NumberOfProperties];
    
    // Define results.
    HRESULT hr;
    
    // Define format name buffer.
    DWORD dwFormatNameBufferLength = 256;
    WCHAR szFormatNameBuffer[256];
    
  2. Specify PROPID_Q_TRANSACTION.
    aQueuePropId[PropIdCount] = PROPID_Q_TRANSACTION;  //Property ID
    aQueuePropVar[PropIdCount].vt = VT_UI1;            //Type indicator
    PropIdCount++;
    
  3. Add any additional queue properties. When adding properties, increment the NumberOfProperties variable to reflect the number of properties added.
  4. Set the MQQUEUEPROPS structure.
    QueueProps.cProp = PropIdCount;           // Number of properties
    QueueProps.aPropID = aQueuePropId;        // Ids of properties
    QueueProps.aPropVar = aQueuePropVar;      // Values of properties
    QueueProps.aStatus = aQueueStatus;        // Error reports
    
  5. Obtain the format name of the queue. The example below uses MQPathNameToFormatName to obtain the format name of a known queue. Other functions that can be used are MQHandleToFormatName and MQInstanceToFormatName.
    hr = MQPathNameToFormatName(L"machinename\\queuename",
                                  szFormatNameBuffer,
                                      &dwFormatNameBufferLength);
    if (FAILED(hr))
       {
       fprintf(stderr, "Failed in MQPathNameToFormatName, error = 0x%x\n",hr);
       return -1;
       }
  6. Call MQGetQueueProperties.
    hr = MQGetQueueProperties(szFormatNameBuffer, &QueueProps);
    if (FAILED(hr))
       {
       fprintf(stderr, "Failed in MQGetQueueProperties, error = 0x%x\n",hr);
       return -1;
       }
     
  7. Examine the value of the returned property. In this example, the transaction level of the queue is printed to the screen.
    if (aQueuePropVar[0].bVal == MQ_TRANSACTIONAL)
     printf("PROPID_Q_TRANSACTION is set to MQ_TRANSACTIONAL.\n");
     else
     printf("PROPID_Q_TRANSACTION is set to MQ_TRANSACTIONAL_NONE.\n");
     

Example Code

The following example retrieves the PROPID_Q_TRANSACTION property for a known queue and then prints the returned value to the screen.

#include <windows.h>
#include <stdio.h>
#include <mq.h>                       // MSMQ header file


int main(int arg, char *argv[])

{
  ///////////////////////////
  //  Define structures.
  ////////////////////////////

  // Define number of properties to be retrieved.
  #define NumberOfProperties 1

  // Define property counter.
  DWORD PropIdCount = 0;

  // Define the MQQUEUPROPS structure.
  MQQUEUEPROPS QueueProps;
  PROPVARIANT aQueuePropVar[NumberOfProperties];
  QUEUEPROPID aQueuePropId[NumberOfProperties];
  HRESULT aQueueStatus[NumberOfProperties];
  
  // Define results.
  HRESULT hr;
  
  // Define format name buffer.
  DWORD dwFormatNameBufferLength = 256;
  WCHAR szFormatNameBuffer[256];
  
  
  ///////////////////////////////////
  // Specify PROPID_Q_TRANSACTION.
  ///////////////////////////////////
  
  aQueuePropId[PropIdCount] = PROPID_Q_TRANSACTION; // Property ID
  aQueuePropVar[PropIdCount].vt = VT_UI1;            // Type indicator
  PropIdCount++;
  
  
  ///////////////////////////////////////////////////////
  // Add additional queue properties here. When adding 
  // properties, increment NumberOfProperties to 
  // reflect total number of properties.
  ///////////////////////////////////////////////////////
  
  
  ////////////////////////////////
  // Set the MQQUEUEPROPS structure.
  /////////////////////////////////
  
  QueueProps.cProp = PropIdCount;           // Number of properties
  QueueProps.aPropID = aQueuePropId;        // Ids of properties
  QueueProps.aPropVar = aQueuePropVar;      // Values of properties
  QueueProps.aStatus = aQueueStatus;        // Error reports
  
  
  ////////////////////////////
  //Get format name of queue.
  ////////////////////////////
 
  hr = MQPathNameToFormatName(L"computername\\queuename",
                              szFormatNameBuffer,
                                  &dwFormatNameBufferLength);
  if (FAILED(hr))
  {
    fprintf(stderr, "Failed in MQPathNameToFormatName, error = 0x%x\n",hr);
  return -1;
  }
 
 
  ////////////////////////////
  // Get queue property.
  ////////////////////////////
  
  hr = MQGetQueueProperties(szFormatNameBuffer, &QueueProps);
  if (FAILED(hr))
  {
    fprintf(stderr, "Failed in MQGetQueueProperties, error = 0x%x\n",hr);
    return -1;
  }
  
  
  //////////////////////////////////////////////
  // Review returned value. This example prints 
  // out the authentication level of the queue.
  //////////////////////////////////////////////
  
  if (aQueuePropVar[0].bVal == MQ_TRANSACTIONAL)
        printf("PROPID_Q_TRANSACTION is set to MQ_TRANSACTIONAL.\n");
    else
    printf("PROPID_Q_TRANSACTION is set to MQ_TRANSACTIONAL_NONE.\n");
  
  
  return 0;
 
}