Конференция "Corba" » MSMQ send messages [Delphi, Windows]
 
  • Den26 (15.02.06 09:20) [0]
    Имеется сервер очередей MSMQ, нашел библиотеку которая позволяется работать с очередями - MSMQ_TLB. Есть следующий код для отсылки сообщения в очередь и есть аналогичный для чтения. Для чтения работает отлично. При отсылке же сообщения оно не попадает в очередь, в чем могут быть грабли?
    var
     queuename, subject: string;
     data: olevariant;
     queueinfo: IMSMQQueueInfo;
     queue: IMSMQQueue;
     msg: IMSMQMessage;
     tr: OLEVariant;

    begin
    { nastavimo par lastnosti }
    { queuename  je naslov predala pri čemer je ORION ime mojega računalnika, Kekec pa ime predala}
    queuename := 'Direct=OS:ORION\private$\Kekec';
    subject := Edit1.text;
    data := Memo1.text;

    // poskusimo poslati v Q
    try
       queueinfo := CreateCOMObject (CLASS_MSMQQueueInfo) as IMSMQQueueInfo;
       queueinfo.FormatName := queuename;
       queue := queueinfo.Open (MQ_SEND_ACCESS, MQ_DENY_NONE);
       if queue.IsOpen  1 then
           statusbar1.SimpleText := 'Ne morem dostopati do predala!'
       else
       begin
           try
           msg := CreateCOMObject (CLASS_MSMQMessage) as IMSMQMessage;
           msg.label_ := subject;
           msg.body := data;
           tr := MQ_SINGLE_MESSAGE;     // ker smo označili da je naš predal Transactional
           msg.Send (queue, tr);
           statusbar1.SimpleText := 'Odposlano!'
           finally
           queue.close;
           end;
       end;
    except
       on e: exception do showmessage (e.message);
    end;

    end;

  • Raff © (07.10.07 01:22) [1]
    var
     myInfo: TMSMQQueueInfo;
     myQueue: IMSMQQueue2;
     myMessage: TMSMQMessage;
    begin
     myInfo := TMSMQQueueINfo.Create(Application.MainForm);
     myInfo.FormatName := 'DIRECT=TCP:192.168.0.1\private$\<имя_очереди>';
     myQueue := myInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE);
     myMessage := TMSMQMessage.Create(Application.MainForm);
     myMessage.Label_ := 'It is a label';
     myMessage.Body := 'It is a Text - Body of the message';
     myMessage.Send(myQueue);
     myQueue.Close;
    end;

    Вот в таком варианте у меня все работает.
    Да...и еще. По умолчанию компилятор будет ругаться.
    Надо подправить MSMQ_TLB.pas:
    ...
    procedure TMSMQMessage.Set_Label_(const pbstrLabel: WideString);
     { Warning: The property Label_ has a setter and a getter whose
       types do not match. Delphi was unable to generate a property of
       this sort and so is using a Variant as a passthrough. }
    var
     InterfaceVariant: OleVariant;
    begin
     InterfaceVariant := DefaultInterface;
     InterfaceVariant.Label_ := pbstrLabel; вот эту строчку поменяй на следующую
     InterfaceVariant.Label := pbstrLabel;
    end;
  • em240 © (09.10.07 10:47) [2]
    А как лучше отслеживать приход новых сообщений?
    В событие таймера кидай функцию приёма или по-другому?
  • em240 © (09.10.07 17:41) [3]
    Удалено модератором
    Примечание: Флуд
  • имя (08.09.08 11:56) [4]
    Удалено модератором
 
Конференция "Corba" » MSMQ send messages [Delphi, Windows]
Есть новые Нет новых   [134430   +3][b:0][p:0.001]