C-C++ Code Example: Opening a Private Queue Using a Computer Identifier and Queue Number
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 opens a private queue based on the local computer using its computer identifier and a queue number provided by the caller.
The caller can obtain the queue number from the names of the LQSfiles stored in the Lqs folder (the Lqs folder is created when MSMQ is installed) on the computer. The queue number is the first part of the name of each file.
The following procedure shows how the function opens the queue based on the information provided by the caller.
To open a queue using a computer identifier and queue number
Define the maximum number of properties to be specified, property counter and the MQQMPROPS structure. In this example the computer identifier property is the only property specified.
Specify the PROPID_QM_MACHINE_ID computer property
Initialize the MQQMPROPS structure.
Call MQGetMachineProperties to retrieve the globally unique identifier (GUID) of the computer. The following code example retrieves the GUID of the local computer.
Construct a private format name for the queue using the computer GUID returned by MQGetMachineProperties and the provided queue number. (This example uses the RPC function UuidToString to construct the format of the private queue.)
The syntax of the private format name is shown below:
"PRIVATE=ComputerGUID\QueueNumber"
Using the constructed format name and the access and share modes provided in the call, call MQOpenQueue to open the queue.
Code Example
The library and header files required for the RPC calls made by this function are rpcrt4.lib and rpc.h, respectively. This function contains no version-specific Message Queuing calls.
HRESULT OpenMyQueue(
CHAR szQueueNumber[]
)
{
HRESULT hr = MQ_OK; // Return code
// Define the maximum number of properties, a property counter, and
// an MQQMPROPS structure.
const int NUMBEROFPROPERTIES = 1; // Number of computer properties
DWORD cPropId=0; // Property counter
MQQMPROPS qmprops;
QMPROPID aQMPropId[NUMBEROFPROPERTIES];
MQPROPVARIANT aQMPropVar[NUMBEROFPROPERTIES];
HRESULT aQMStatus[NUMBEROFPROPERTIES];
// Specify PROPID_QM_MACHINE_ID.
CLSID guidMachineId; // Computer GUID buffer
aQMPropId[cPropId] = PROPID_QM_MACHINE_ID; // Property ID
aQMPropVar[cPropId].vt = VT_CLSID; // Type indicator
aQMPropVar[cPropId].puuid = &guidMachineId; // Computer GUID buffer
cPropId++;
// Initialize the MQQMPROPS structure.
qmprops.cProp = cPropId; // Number of properties
qmprops.aPropID = aQMPropId; // IDs of the properties
qmprops.aPropVar = aQMPropVar; // Values of the properties
qmprops.aStatus = aQMStatus; // Error reports
// Call MQGetMachineProperties to retrieve the
// GUID of the computer where the queue is registered.
hr = MQGetMachineProperties(NULL,
NULL,
&qmprops);
if (FAILED(hr))
{
fprintf(stderr, "An error occurred in MQGetMachineProperties (error: 0x%x).\n",hr);
return hr;
}
// Construct the format name of the private queue. The returned
// computer GUID is translated into a string and then combined
// with the queue number.
UCHAR *pszUuid = 0; // Computer GUID string
CHAR szFormatNameBuffer[256]; // Format name buffer
WCHAR wszFormatNameBuffer[256]; // Wide-character format name buffer
if (UuidToString(&guidMachineId, &pszUuid) != RPC_S_OK)
{
fprintf(stderr, "An error occurred in UuidToString.\n");
return E_FAIL;
}
else
{
// Combine the computer ID and queue number.
// ************************************
// You must concatenate "PRIVATE=", pszUuid, "\", pszUuid, and
// szQueueNumber into the szFormatNameBuffer buffer.
// szFormatNameBuffer = "PRIVATE=" + pszUuid + "\" + pszUuid +
// szQueueNumber
// If the format name is too long for the buffer, return S_FALSE.
// ************************************
// Convert the format name to a wide-character string.
mbstowcs(wszFormatNameBuffer,
szFormatNameBuffer,
sizeof(szFormatNameBuffer));
RpcStringFree(&pszUuid);
}
// Open the queue.
QUEUEHANDLE hQueue = NULL; // Handle of the created queue
DWORD dwAccess = MQ_SEND_ACCESS; // Access mode of the queue
DWORD dwShareMode = MQ_DENY_NONE; // Share mode of the queue
hr = MQOpenQueue(
wszFormatNameBuffer, // Format name of the queue
dwAccess, // Access mode
dwShareMode, // Share mode
&hQueue // OUT: Queue handle
);
if (FAILED(hr))
{
fprintf(stderr, "An error occurred in MQOpenQueue (error: 0x%x).\n",hr);
return hr;
}
puts("The queue is opened to send messages.");
return hr;
}