MSMQ(COM)检查私有队列是否存在

时间:2014-03-27 18:21:21

标签: delphi com delphi-7 msmq

我可以使用Delphi7中的MSMQ COM组件检查我的PC上是否存在私有队列,具有路径或格式名称? 我读到了LookupQueue,但它似乎只适用于公共队列,我需要一个我不知道的GUID。欢迎任何其他替代或正确使用LookupQueue示例。

1 个答案:

答案 0 :(得分:0)

这是我前一段时间使用过的一段代码。

function GetAllPrivateQueues( const aMachine : WideString; aStrL : TStrings) : HRESULT;
// Returns a list of all private queues of a given machine
type PPWideChar = ^PWideChar;
var props : MQMGMTPROPS;
    keys  : array[0..0] of MGMTPROPID;
    vals  : array[0..0] of MQPROPVARIANT;
    ppws  : PPWideChar;
    i     : Integer;
begin
  // Init Props
  props.cProp    := 0;
  props.aPropID  := @keys;
  props.aPropVar := @vals;
  props.aStatus  := nil;

  // we want private queues
  ASSERT( props.cProp < (SizeOf(keys) / SizeOf(PROPID)));
  keys[props.cProp]         := PROPID_MGMT_MSMQ_PRIVATEQ;
  vals[props.cProp].vt      := VT_NULL;
  Inc(props.cProp);

  // MQMgmtGetInfo() has what we want, requires MSMQ 3.0
  result := MQMgmtGetInfo( PWideChar(aMachine), MO_MACHINE_TOKEN, props);
  if FAILED(result) then Exit;

  // collect the names
  // cast required this way, the data type in ActiveX.pas (D7) is incorrect
  ppws := PPWideChar(vals[0].calpwstr.pElems);
  for i := 0 to vals[0].calpwstr.cElems-1 do begin
    aStrL.Add( ppws^);
    MQFreeMemory( ppws^);
    Inc(ppws);
  end;
end;

请注意,根据您的确切环境和/或Delphi版本,可能需要进行一些调整。我自己做了windows标题翻译,因为当时我(也)需要它用于D7。 Windows SDK中提供了头文件,相关起点为mq.h