Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3622724
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 18, 20262026-05-18T23:17:42+00:00 2026-05-18T23:17:42+00:00

I need to start writing some MSMQ code that will interface with WCF code

  • 0

I need to start writing some MSMQ code that will interface with WCF code on other machines. Does someone with MSMQ experience make recommendations about pros and cons of MSMQ using straight C++ versus using COM?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-18T23:17:43+00:00Added an answer on May 18, 2026 at 11:17 pm

    Actually you don’t have to decide. You can combine.

    Here is a code sample for a full send/recv implementation.

    Just let me know if you improved it…

    h file:

    #pragma once
    
    #include <tchar.h>
    
    // ==========================================================================
    // MSMQWrapper - wrappes the COM object used to send and receive messages through the MSMQ
    class CMSMQWrapper
    {
        HANDLE m_hQ;
    
    public:
        CMSMQWrapper()
        {
            m_hQ= INVALID_HANDLE_VALUE;
            ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
        }
    
        ~CMSMQWrapper()
        {
            ::CoUninitialize();
        }
    
        bool InitLocalQueue (const WCHAR* wczQueueName     ); // [i] .\private$\queue_name
        bool InitDestQueue  (const WCHAR* wczDestQueueName ); // [i] comp_name\private$\queue_name
    
        bool ReadQueue      (const WCHAR* wczQueueName    ,   // [i]
                                   BYTE*  pBuf            ,   // [i]
                                   size_t nBufLen         ,   // [i]
                                   int&   nBytesRead       ); // [o]
    
        bool SendToDestQueue(const BYTE*  pBuf            ,
                                   size_t nBufLen          );
    };
    

    cpp file:

    #include "stdafx.h"
    #include "msmqwrap.h"
    
    #include <windows.h>
    #include <AtlBase.h>
    #import "mqoa.dll" named_guids // no_namespace
    
    #pragma comment (lib, "Mqrt.lib")
    #include "mq.h"
    
    using namespace MSMQ;
    
    // ==========================================================================
    // CMSMQWrapper
    // ==========================================================================
    
    bool CMSMQWrapper::InitLocalQueue(const WCHAR* wczQueueName)
    {
        CComQIPtr<IMSMQQueueInfo, &IID_IMSMQQueueInfo> ipQueueInfo;
    
        HRESULT hr= ::CoCreateInstance(CLSID_MSMQQueueInfo     ,
                                       NULL                    ,
                                       CLSCTX_SERVER           ,
                                       IID_IMSMQQueueInfo      ,
                                       (void**)(&ipQueueInfo.p) );
        if (S_OK != hr)
            return false;
    
        hr= ipQueueInfo->put_PathName(_bstr_t(wczQueueName));
        if (S_OK != hr)
            return false;
    
        hr= ipQueueInfo->put_Label(_bstr_t(wczQueueName));
        if (S_OK != hr)
            return false;
    
        VARIANT vtFalse;
        VariantInit(&vtFalse);
        vtFalse.vt     = VT_BOOL;
        vtFalse.boolVal= FALSE  ;
    
        try
        {
            hr= ipQueueInfo->Create(&vtFalse, &vtFalse);
        }
        catch (_com_error& er)
        { 
            if (MQ_ERROR_QUEUE_EXISTS == er.Error()) // queue already exists
                hr= S_OK;
            else
            {
                // report error - Failed receiving, (WCHAR*)er.Description()
                return false;
            }
        }
    
        return true;
    }
    
    // --------------------------------------------------------------------------
    bool CMSMQWrapper::ReadQueue(const WCHAR* wczQueueName,  // [i]
                                 BYTE*        pBuf        ,  // [i]
                                 size_t       nBufLen     ,  // [i]
                                 int&         nBytesRead   ) // [o]
    {
        // set value of ReceiveTimout parameter
        _variant_t vtReceiveTimeout;
        vtReceiveTimeout= (long)INFINITE;
    
        try
        {
            IMSMQQueueInfoPtr qinfo("MSMQ.MSMQQueueInfo");
            qinfo->PathName= wczQueueName;
    
            IMSMQQueuePtr qRec;
            qRec= qinfo->Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE); // open queue to retrieve message
    
            // retrieve messages from queue
            IMSMQMessagePtr msgRec("MSMQ.MSMQMessage");
            msgRec= qRec->Receive(&vtMissing, &vtMissing, &vtMissing, &vtReceiveTimeout);
            if (NULL == msgRec)
            {
                nBytesRead= 0; // there are no messages in the queue
                return true;
            }
    
            nBytesRead           = msgRec->BodyLength;
            _variant_t recVariant= msgRec->Body      ;
    
            // close queue
            qRec->Close();
    
            SAFEARRAY* psa= recVariant.parray;
            nBytesRead    = __min(psa->rgsabound->cElements, nBufLen);
    
            for (LONG ind= 0; ind< nBytesRead; ind++)
                SafeArrayGetElement(psa, &ind, &pBuf[ind]);
    
            return true;
        }
        catch (_com_error comerr)
        {
            // report error - failed receiving, (WCHAR*)comerr.Description());
            return false;
        }
    }
    
    // --------------------------------------------------------------------------
    bool CMSMQWrapper::InitDestQueue(const WCHAR* wczDestQueueName) // comp_name\private$\queue_name
    {
        // validate the input strings
        if (NULL == wczDestQueueName)
            return false;
    
        // create a direct format name for the queue
        WCHAR wczFormatName[1000];
        str_cat(wczFormatName, 1000, L"DIRECT=OS:", wczDestQueueName);
    
        HRESULT hr;
        hr = ::MQOpenQueue(wczFormatName, MQ_SEND_ACCESS, MQ_DENY_NONE, &m_hQ);
        if (MQ_OK != hr) //MQ_ERROR_QUEUE_NOT_FOUND
            return false;
    
        return true;
    }
    
    // --------------------------------------------------------------------------
    bool CMSMQWrapper::SendToDestQueue(const BYTE* pBuf, size_t nBufLen)
    {
        MQMSGPROPS  MsgProps         ;
        const UINT  _nProps= 1       ;
        MSGPROPID   aPropId [_nProps];
        PROPVARIANT aVariant[_nProps];
    
        aPropId [0]            = PROPID_M_BODY   ; // msg to send
        aVariant[0].vt         = VT_VECTOR|VT_UI1;
        aVariant[0].caub.pElems= (BYTE*)pBuf     ;
        aVariant[0].caub.cElems= nBufLen         ;
    
        MsgProps.cProp         = _nProps         ; // number of props to set
        MsgProps.aPropID       = aPropId         ;
        MsgProps.aPropVar      = aVariant        ;
        MsgProps.aStatus       = 0               ;
    
        if (MQ_OK != ::MQSendMessage(m_hQ, &MsgProps, MQ_NO_TRANSACTION))
            return false;
    
        return true;
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm writing some code that calculates certain statistics about word usages. Does anyone know
I want to start writing some blog and I know that i will past
I'm writing some code that takes a report from the mainframe and converts it
I'm writing some code that has to cascade delete records in a certain database,
How does one start development in Silverlight? Does one need a new IDE? or
I am trying to start writing some simple jQuery plugins and for my first
I need to know how to start writing an application based on plug-in architecture.
I'm writing some C++/Win32 code to search for a user in an LDAP directory
Suppose I'm writing some environment which execute clients code (Java). Clients send jar with
I need to start the command window with some arguments and run more commands

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.