Working with MSMQ in Visual C++

Message Queuing Overview:

 

Message Queuing is a message infrastructure and a development platform for creating distributed, loosely-coupled messaging applications. Message queuing applications can use the Message Queuing infrastructure to communicate across heterogeneous networks and with computers that may be offline. Message Queuing provides guaranteed message delivery, efficient routing, security, transaction support, and priority-based messaging.

Applications can create queues, locate existing queues, open queues, send messages to queues, read messages in queues, set and retrieve queue properties, and set and retrieve the security descriptors of queues.

 

The following code does the following:

1. Create a new Queue

2. Opening an existing Queue

3. Sending and Receiving messages to/from Queues.

 

Creating the Project and Application

To create the application, follow these steps in Visual C++ 6.0 IDE:

1. Create a new project, named RWMSMQ, using the same AppWizard settings in Visual C++ 6.0 IDE.

2. Choose Dialog based application.

3. Click Finish.

4.Select the Dialog from the Resource editor of Visual C++ IDE and the following controls as show in the following table:

TABLE 1. CONTROL PROPERTY SETTINGS

 

Object

Property

Setting

Static Text

ID

IDC_STATIC

 

Caption

MSMQ Server

Edit Box

ID

IDC_MSMQSERVER

Static Text

ID

IDC_STATIC

 

Caption

Message Label

Edit Box

ID

IDC_MSGLABEL

Group Box

ID

IDC_STATIC

 

Caption

QUEUE TYPE

Radio Button

ID

IDC_PRIVATE

 

Caption

Private

Radio Button

ID

IDC_PUBLIC

 

Caption

Public

Check Box

 ID

IDC_JOURNAL

Edit Box

ID

IDC_TEXT

Button

ID

IDC_CREATE

 

Caption

Create

Button

ID

IDC_SEND

 

Caption

Send

Button

ID

IDC_RECEIVE

 

Caption

Receive

Button

ID

IDC_CLEAR

 

Caption

Clear

Button

ID

IDC_EXIT

 

Caption

Exit

 

Right click on the Group box, go to properties window. Select the Group Checkbox.

 

Adding the Application Variables

Now you need to add a few other variables for the other controls, as listed in Table below.

 

CONTROL VARIABLES.

Object

Name

Category

Type

IDC_MSMQSERVER

m_ServerName

 Value

CString

IDC_MSGLABEL

m_msgLabel

Value

CString

IDC_TEXT

m_msgData

Value

CString

IDC_JOURNAL

m_Journal

Control

CButton

 

After you add all the variables using the Class Wizard.

Add the member functions for the Command Buttons using Class Wizard in Visual C++ IDE.

 

Importing the MSMQ dll in Visual C++:

 

#import "mqoa.dll"

using namespace MSMQ;

 

Add the above code in RWMSMQDlg.h

 

Add the following function definitions in the RWMSMQDlg.h .After this comment write the following code:

 

Protected:

// Generated message map functions

            afx_msg void ReleaseAll();

 

Adding the Global Variables:

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

Add the following Code after this code in the RWMSMQDlg.cpp:

 

// Global Variables

 

#define BUFSIZE 1024

IMSMQQueuePtr        qDest;  // Represents Destination Queue

IMSMQQueueInfoPtr  qInfo;     //Represents an open instance of the destination queue

IMSMQQueueInfoPtr  qRead;

IMSMQMessagePtr     qMsg;     //Represents the message

 

LPTSTR lpszSystemInfo;      // pointer to system information string

DWORD cchBuff = BUFSIZE;    // size of computer

TCHAR tchBuffer[BUFSIZE];   // buffer for string

 

Initialization:

 

In OnInitDialog function Add the new code:

 

BOOL CRWMSMQDlg::OnInitDialog()

{

?

?

?

// TODO: Add extra initialization here

 

qDest = NULL;

CoInitialize(NULL);

try

{

  qInfo.CreateInstance("MSMQ.MSMQQueueInfo");

  qRead.CreateInstance("MSMQ.MSMQQueueInfo");

  qMsg.CreateInstance("MSMQ.MSMQMessage");

   lpszSystemInfo = tchBuffer;

   GetComputerName(lpszSystemInfo,&cchBuff); //Getting the ComputerName

   m_ServerName=lpszSystemInfo;

   UpdateData(FALSE); 

}

catch (_com_error)

{

  AfxMessageBox("Failed in CreateInstance of MSMQQueueInfo");

  PostQuitMessage(1);

  ReleaseAll();

}

 return TRUE;  // return TRUE  unless you set the focus to a control

}

 

THE Create FUNCTION: This function will create a queue .

 

void CRWMSMQDlg::OnCreate()

{

  UpdateData(TRUE);

   try

    {

      qInfo->PathName=m_ServerName.AllocSysString();   // Setting the Queue Path

      qInfo->Label=m_msgLabel.AllocSysString();          // Setting the Queue Label

      qInfo->Create();

      qInfo->Journal=1;                     // Enabling the Journal Option

      qInfo->Update();

      qInfo->Refresh();

     }

    catch (_com_error)

    {

      AfxessageBox("Creating a Queue Failed");

      //ReleaseAll();

     }

     UpdateData(FALSE);

     m_msgLabel="";

 

THE Send FUNCTION: This function is used to send the message to the queue.

 

void CRWMSMQDlg::OnSend()

{

            UpdateData(TRUE);

            CString fname;

            VARIANT vMessage;

 

            try

            {

            // Create a direct format name of the queue, and

    // set the FormatName property of the MSMQQueueInfo object.

                     

                fname="DIRECT=OS:";

                fname+=m_ServerName;

                qInfo->PathName=m_ServerName.AllocSysString();

                qInfo->FormatName = fname.AllocSysString();   

  // Open the queue.

                qDest = qInfo->Open(MQ_SEND_ACCESS, MQ_DENY_NONE);

                qMsg->Label = m_msgLabel.AllocSysString();

                VariantInit(&vMessage);

                vMessage.vt=VT_BSTR;

                vMessage.bstrVal=m_msgData.AllocSysString();

                qMsg->put_Body(vMessage);

                VariantClear(&vMessage);

                qMsg->Send(qDest);

                qDest->Close();

         }

        catch(_com_error)

         {

            AfxMessageBox("Sending the Queue failed","Send Queue",1);

            //ReleaseAll();

          }

}

 

THE Read FUNCTION: This function is used to Read the messages from queue and it will put in the Journal folder.

 

void CRWMSMQDlg::OnRead()

{

            UpdateData(TRUE);

            _variant_t vtReceiveTimeout;

            _bstr_t label,body;

            CString fname;

            int status=m_journal.GetCheck();

            try

            {

              qRead->PathName=m_ServerName.AllocSysString();

              fname="DIRECT=OS:";

              fname+=m_ServerName;

              if(status==1) fname=fname+";Journal";  // If Journal Option is Checked

                       

              qInfo->PathName=m_ServerName.AllocSysString();

              qRead->FormatName = fname.AllocSysString();

             qDest = qRead->Open(MQ_RECEIVE_ACCESS,MQ_DENY_NONE);

             qMsg = qDest->Receive(&vtMissing,&vtMissing,&vtMissing,&vtReceiveTimeout);

              label=qMsg->GetLabel();

              body=qMsg->GetBody().bstrVal;

              m_msgLabel=(LPSTR)label;

              m_msgData=(LPSTR)body;

              UpdateData(FALSE);

              qDest->Close();

        }

            catch(_com_error)

            {

              AfxMessageBox("Reading the Queue Failed","Read Queue",1);     

               //ReleaseAll();

            }

}

 

THE Clear FUNCTION:

 

void CRWMSMQDlg::OnClear()

{

            m_msgLabel="";

            m_msgData="";

            UpdateData(FALSE);

}

 

THE Exit FUNCTION: This function is used to Exit from dialog box.

 

void CRWMSMQDlg::OnExit()

{

                        ::PostQuitMessage(1);

}

 

THE Private FUNCTION:

 

void CRWMSMQDlg::OnPrivate()

{

            m_ServerName=lpszSystemInfo;

            m_ServerName+="\\Private$\\";

            UpdateData(FALSE);

}

 

THE Public FUNCTION:

 

void CRWMSMQDlg::OnPublic()

{

            m_ServerName=lpszSystemInfo;

            m_ServerName+="\\Public$\\";

            UpdateData(FALSE);

}

 

THE ReleaseAll FUNCTION: This functions is to release the objects from memory and un-initialize the COM Library.

 

void CRWMSMQDlg::ReleaseAll()

{

             qInfo->Release();

             qRead->Release();

             qMsg->Release();

             CoUninitialize();

}

   Download the Project Files here.

Close    To Top
  • Prev Article-Programming:
  • Next Article-Programming:
  • Now: Tutorial for Web and Software Design > Programming > c > Programming Content
    Photoshop Tutorial
     

    Special Effect

      3D Effect
      Photoshop Articles
    Programming Tutorial
     

    C/C++ Tutorial

      Visual Basic
      C# Tutorial
    Database Tutorial
     

    MySQL Tutorial

      MS SQL Tutorial
      Oracle Tutorial