Я использую 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-файл должен синхронизироваться с очередями в системе, но эта часть довольно статична.