Как использовать Lookupqueue? - PullRequest
2 голосов
/ 15 февраля 2012

Я использую Delphi 2007 и пытаюсь выяснить, как спросить Windows (XP, Server 2003 или 2008), установлена ​​ли именованная очередь MSMQ.Я нашел this , но он есть в C ++, поэтому его нелегко использовать из Delphi.Например, у меня установлена ​​очередь с именем. \ Private $ \ nctsinqueue.Он отлично работает, используя:

var
  QueueInfo : IMSMQQueueInfo2;
begin
  QueueInfo := CoMSMQQueueInfo.Create;

Проблема в том, что в некоторых установках Windows, где установлено мое приложение, эта очередь не существует.Это зависит от предпочтений, если очередь нужна.Поэтому я хочу спросить Windows, установлена ​​ли именованная очередь, и в этом случае я могу продолжить с кодом выше.

РЕДАКТИРОВАТЬ: Попробовал этот код

function Test: Boolean;
var
  QueueInfo : IMSMQQueueInfo2;
begin
  Result := True;
  QueueInfo := CoMSMQQueueInfo.Create;
  QueueInfo.PathName := '.\private$\nonexistingqueue';
  FQueue := QueueInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE);
end;

И это вызывает исключение в последней строке.Конечно, я могу попробовать / исключить здесь и вернуть False в этом случае, но мне не нравится иметь исключение для этого.Я хочу спросить WinApi или что-то, если очередь существует.Queue.IsOpen, что kobik предложить говорит только, если существующая очередь открыта.Конечно, он должен существовать, прежде чем его можно будет открыть.

Edit2: Я использую более практичный подход к этому, поэтому я решил его с помощью ini-файлов для своего приложения.Он пытается открыть только если очередь присутствует в ini-файле.Недостатком, конечно, является то, что ini-файл должен синхронизироваться с очередями в системе, но эта часть довольно статична.

...