Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

203 lines
4.9 KiB

#include "msmqmon.h"
const int NUMBEROFPROPERTIES = 5;
MSMQMon::MSMQMon()
{
ZeroMemory( szQueueName, sizeof szQueueName );
hOpenQueue = NULL;
dwQueueAccessType = MQ_PEEK_ACCESS; //default queue access type to peeking
dwMsgWaitTime = 1;
}
MSMQMon::MSMQMon( TCHAR *szQueueToMonitor)
{
ZeroMemory( szQueueName, sizeof szQueueName );
hOpenQueue = NULL;
dwMsgWaitTime = 1;
dwQueueAccessType = MQ_PEEK_ACCESS; //default queue access type to peeking
StringCbCopy( szQueueName, sizeof szQueueName, szQueueToMonitor );
}
MSMQMon::~MSMQMon(void)
{
}
void MSMQMon::DisplayCurrentQueue( TCHAR *szUserVar )
{
_tprintf( _T("Current queue: %s\n"), szQueueName );
}
void MSMQMon::SetMessageWaitTime( DWORD dwNewWaitTime )
{
if ( 0 >= dwNewWaitTime )
dwMsgWaitTime = dwNewWaitTime;
}
HRESULT MSMQMon::ConnectToQueue( DWORD constAccessType )
{
dwQueueAccessType = constAccessType;
return ( ConnectToQueue() );
}
HRESULT MSMQMon::ConnectToQueue( void )
{
TCHAR szConnectString[256];
HRESULT hResult = MQ_OK;
hResult = StringCbCopy( szConnectString, sizeof szConnectString, _T("DIRECT=OS:") );
if ( SUCCEEDED( hResult ) )
{
hResult = StringCbCat ( szConnectString, sizeof szConnectString, szQueueName );
if SUCCEEDED( hResult )
{
hResult = MQOpenQueue( (LPCWSTR)szConnectString, dwQueueAccessType, MQ_DENY_NONE, &hOpenQueue );
}
}
return ( hResult );
}
HRESULT MSMQMon::CloseOpenQueue( void )
{
return ( MQCloseQueue( hOpenQueue ) );
}
DWORD MSMQMon::CountMessagesInQueue( int *count )
{
HRESULT hResult; //MSMQ function return results
MQMSGPROPS mqProperties;
HANDLE hQueueCursor;
//initialize the structure with junk, we aren't reading messages, so it doesn't matter
mqProperties.cProp = 0;
mqProperties.aPropID = NULL;
mqProperties.aStatus = NULL;
mqProperties.aPropVar = NULL;
*count = 0;
hResult = MQCreateCursor( hOpenQueue, &hQueueCursor );
if( MQ_OK != hResult )
return hResult;
hResult = MQReceiveMessage ( hOpenQueue,
dwMsgWaitTime, //amount of time to wait for a message (MS)
MQ_ACTION_PEEK_CURRENT,
&mqProperties,
NULL, //overlapped structure
NULL, //callback
hQueueCursor, //cursor
MQ_NO_TRANSACTION
);
if ( MQ_OK == hResult )
{
(*count)++;
do
{
hResult = MQReceiveMessage(hOpenQueue,
dwMsgWaitTime,
MQ_ACTION_PEEK_NEXT,
&mqProperties,
NULL,
NULL,
hQueueCursor,
MQ_NO_TRANSACTION
);
if (FAILED(hResult))
{
break;
}
(*count)++;
} while (SUCCEEDED(hResult));
MQCloseCursor( hQueueCursor );
return MQ_OK;
}
else
{
MQCloseCursor( hQueueCursor );
return hResult;
}
}
//This function was borrwed from the ISAPI dll, and modified slighly to fit here in this app.
//if you have a problem with this, then, go buy a bridge.
BOOL MSMQMon::SendQueueMessage( void )
{
MQMSGPROPS msgProps;
MSGPROPID aMsgPropId[NUMBEROFPROPERTIES];
MQPROPVARIANT aMsgPropVar[NUMBEROFPROPERTIES];
HRESULT aMsgStatus[NUMBEROFPROPERTIES];
DWORD cPropId = 0;
BOOL Status = TRUE;
HRESULT hResult = S_OK;
char szGuid[512];
char szPath[512];
TCHAR szMessageTitle[] = _T("This is a test message title");
TCHAR szMessageBody[] = _T("This is a test message body");
aMsgPropId [cPropId] = PROPID_M_LABEL; // Property ID.
aMsgPropVar[cPropId].vt = VT_LPWSTR; // Type indicator.
aMsgPropVar[cPropId].pwszVal = szMessageTitle; // The message label.
cPropId++;
aMsgPropId [cPropId] = PROPID_M_BODY;
aMsgPropVar [cPropId].vt = VT_VECTOR|VT_UI1;
aMsgPropVar [cPropId].caub.pElems = (LPBYTE) szMessageBody;
aMsgPropVar [cPropId].caub.cElems = (DWORD) sizeof szMessageBody;
cPropId++;
aMsgPropId [cPropId] = PROPID_M_BODY_TYPE;
aMsgPropVar[cPropId].vt = VT_UI4;
aMsgPropVar[cPropId].ulVal = (DWORD) VT_BSTR;
cPropId++;
// Initialize the MQMSGPROPS structure.
msgProps.cProp = cPropId;
msgProps.aPropID = aMsgPropId;
msgProps.aPropVar = aMsgPropVar;
msgProps.aStatus = aMsgStatus;
//
// Send it
//
hResult = MQSendMessage(
hOpenQueue, // Queue handle.
&msgProps, // Message property structure.
MQ_NO_TRANSACTION // No transaction.
);
if (FAILED(hResult))
{
Status = FALSE;
}
return Status;
}