views:

258

answers:

1

I'm trying to get a C++ service to load an XML document from a MSMQ message generated by C#. I can't really change the C++ side of things because I'm trying to inject test messages into the queue. The C++ service is using the following to load the XML.

 CComPtr<IXMLDOMDocument2> spDOM;
 CComPtr<IXMLDOMNode> spNode;
 CComBSTR bstrVal;

 if(_FAILED(hr = spDOM.CoCreateInstance(CLSID_DOMDocument30)))
 {
  g_infoLog->LogCOMError(hr, "CWorker::ProcessBody() Can't Create DOM");
  pWork->m_nFailure = WORKFAIL_BADXML;
  goto Exit;
 }

hr = spDOM->loadXML(bstrBody, &vbResult);

The C# code to send the MSMQ message looks like this (just test code not pretty):

    // open the queue 
    var mq = new MessageQueue(destinationQueue)
                          {
                              // store message on disk at all intermediaries 

                              DefaultPropertiesToSend = { Recoverable = true },

                              // set the formatter to Binary, default is XML 
                              Formatter = new BinaryMessageFormatter()
                          };

    // send message
    mq.Send(messageContent, "TestMessage");
    mq.Close();

I tried to send the same message using BinaryMessageFormatter but it puts what I think are unicode characters at the top before the XML starts.

.....ÿÿÿ ÿ....... ......À)

If I use the default XML formatter the message has the following top element. The C++ service doesn't seem to handle this.

<?xml version="1 .0"?>..<string>& lt;

Do you know of a way I could easily clean up the unicode characters when using the binary formatter? If so I think it might work.

+1  A: 

Have you tried the ActiveXMessageFormatter? It might not compile with it as the formatter, i have no way to test here, but it might.

EDIT: just tried and it compiles ok, whether the result is any better i still couldn't say for sure.

runrunraygun
Yup, that looks like the formatter I should be using. Thanks!
Jason Rowe