Retrieving PROPID_Q_PATHNAME

The queue's pathname indicates the name of the computer where the queue's messages are stored, if the queue is public or private, and the name of the queue.

When PROPID_Q_PATHNAME is retrieved, the type indicator in the MQQUEUEPROPS structure must be set to VT_NULL, and MQFreeMemory must be called after the return value is used. The VT_NULL setting tells MSMQ to allocate the memory needed for the returned pathname, and MQFreeMemory frees the MSMQ allocated memory.

To retrieve PROPID_Q_PATHNAME
  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_PATHNAME. The type indicator must be set to VT_NULL so that MSMQ allocates memory for the pathname.
    aQueuePropId[PropIdCount] = PROPID_Q_PATHNAME; //Property ID
    aQueuePropVar[PropIdCount].vt = VT_NULL;       //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 pathname of the queue is printed to the screen.
    wprintf(L"The label of the queue is :");
    wprintf(L" %s.\n", aQueuePropVar[0].pwszVal);
    
  8. Call MQFreeMemory to free the memory allocated by MSMQ.
    MQFreeMemory(aQueuePropVar[0].pwszVal);
    if (FAILED(hr))
      {
      fprintf(stderr, "Failed in MQFreeMemory, error = 0x%x\n",hr);
      return -1;
      }
    

Example Code

The following example retrieves the PROPID_Q_PATHNAME property for a known queue and then prints the returned value to the screen. Note that the memory (used to store the label) allocated by MSMQ is freed using MQFreeMemory.

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



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

{
  ////////////////////////////
  //  Define structures.
  ////////////////////////////
  
  // Define the number of properties
  #define NumberOfProperties 1
  
  // Define the 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_PATHNAME. The type 
  // indicator must be set to VT_NULL.
  ///////////////////////////////////
  
  aQueuePropId[PropIdCount] = PROPID_Q_PATHNAME;    // Property ID
  aQueuePropVar[PropIdCount].vt = VT_NULL;       // 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"machinename\\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 pathname of the queue.
  //////////////////////////////////////////////
  
  wprintf(L"The label of the queue is :");
  wprintf(L" %s.\n", aQueuePropVar[0].pwszVal);
  
  
  /////////////////////////////////
  // Free memory allocated by MSMQ. 
  /////////////////////////////////
  
MQFreeMemory(aQueuePropVar[0].pwszVal);
   if (FAILED(hr))
    {
    fprintf(stderr, "Failed in MQFreeMemory, error = 0x%x\n",hr);
        return -1;
    }
  
  return 0;
  
}