-
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; -
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]Удалено модератором