2014-03-27 76 views
1

何我可以檢查我的PC上是否存在私有隊列使用Delphi7中的MSMQ COM組件,具有路徑或格式名稱? 我讀了約LookupQueue,但它似乎只適用於公共隊列,我需要一個我不知道的GUID。歡迎任何其他選擇或正確使用LookupQueue示例。MSMQ(COM)檢查是否存在私有隊列

回答

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; 

請注意,它可能需要一些調整,具體取決於您的確切環境和/或德爾福版本。我自己做了Windows頭文件翻譯,因爲那時我(也)需要它用於D7。頭文件在Windows SDK中可用,相關的起點是mq.h