in reply to Re: CGI to MSMQ
in thread CGI to MSMQ

Thanks hatt!

I already have a .NET Web Service that sends the message, but my company doesn't use IIS (it is a Win32 box, through). The code in c# is like this (many apologies for posting non-Perl code on this site):

[WebMethod] public void sendMessage(string messageText) { string queueName = @".\private$\myQueue"; MessageQueue myQueue = new MessageQueue(queueName); myQueue.Send(messageText); }

Thanks again!
Anonymous Monk

Replies are listed 'Best First'.
Re: Re: Re: CGI to MSMQ
by meredith (Friar) on Jun 12, 2003 at 14:24 UTC
    Hmm, I don't seem to have a MessageQueue COM Object here, but here's my scratch at it:
    use Win32::OLE; my $myQueue = Win32::OLE->new("MessageQueue") or die("Create object failed! :P");
    This sets up the object for you. I don't see a way to pass args to the constructor, so you have to set the property for the target queue. Example:
    $myQueue->{targetQueue} = "./" . $private . "/myQueue";
    Then to send the message it will be so:
    $myQueue->Send($messageText);
    Note that these are analogs for what happens above, and you'll have to work it together like you want/need. I would have been more help if I had the MessageQueue object, but I'm sure my guesses are quite close.
    Also, I'm assuming you know a little about perl or can figure it from the code at hand; declaring variables, subs and such.

    hth

    Later that day: <mope> nobody ever comes back to tell if it worked :P </mope>

    mhoward - at - hattmoward.org
      Sorry for the late reply!

      Unfortunately, I get an error when creating the OLE object. Apparently the object name is wrong or there's no appropriate OLE object..

      Any ideas/advice/code appreciated!

      Anonymous Monk

      Sorry for the delayed response!

      Unfortunately, I get the error:
      Create object failed! :P

      I'm familiar with cgi and Perl, as well as MS technolgies, but using them together is still tricky..

      As usual, any ideas/code/suggestions welcome!
      Anonymous Monk.

        I can't find a MessageQueue object anywhere! I searched around to find out what .dll contains the object you want, and all I can find is that it is part of System.Messaging.dll in the .NET Framework. The only thing is, I've looked at two servers with .NET 1.1 (& MSMQ) and they don't have it. There is another object that seems related, though, it's MSMQ.MSMQQueue; maybe it can serve your purpose? Microsoft provides all the docs for it at MSDN. Actually, you'll probably want to use the MSMQ objects anyway, so you don't waste the time/memory of firing up a .NET CLR object (yes, they're slower, and yes, I hate them :)

        As a side note, do you have an entry, System.Messaging.MessageQueue, in your registry under HKEY_CLASSES_ROOT?

        HTH

        mhoward - at - hattmoward.org
Re: Re: Re: CGI to MSMQ
by gellyfish (Monsignor) on Jun 16, 2003 at 12:08 UTC

    Seeing as you already have this C# Webservice why don't you call it from your Perl program using SOAP::Lite? You may need to add the SoapRpcMethod attribute to the above method under some circumstances.

    It is difficult to map the .NET System.Messaging stuff to Perl as it is a highly abstracted from the MSMQ API but there is an ActiveX interface that can be called using Win32::OLE. The following is unttested (this is a Linux Machine) but should give you a basic idea:

    use Win32::OLE; my $queueinfo = Win32::OLE->new('MSMQ.MSMQQueueInfo'); $queueinfo->{pathname} = '.\private$\myQueue'; my $queue = $queuinfo->Open(2,0); my $message = Win32::OLE->new('MSMQ.MSMQMessage'); $message->{Body} = 'Whatever'; $message->Send($queue);
    You might want to look at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msmq/msmq_ref_app_81gz.asp for more on the MSMQ ActiveX interface.

    /J\
    
Re: Re: Re: CGI to MSMQ
by Anonymous Monk on Jun 17, 2003 at 07:08 UTC
    Thanks both of you.

    My code so far is thus:

    use Win32::OLE; my $queueinfo = Win32::OLE->new('MSMQ.MSMQQueueInfo'); $queueinfo->{pathname} = '\\myServer\private$\myQueueName'; my $queue = $queueinfo->Open(2,0); my $myMsg = Win32::OLE->new("MSMQ.MSMQMessage") or die("Create message object failed! :P"); $myMsg->{Label} = 'myLabel'; $myMsg->{Body} = 'myBody'; $myMsg->Send($queue);

    The script doesn't die, but the message isn't delivered either. In the MS documentation, a MessageQueue object is returned from the $queueInfo->Open() call, but $myQueue of course isn't blessed in my script. Could this be part of the problem?

    Thanks again,
    A.M.