2011-04-27 229 views
0

我想從C++中的MSMQ隊列中讀取消息。 隊列已成功打​​開,但我在閱讀任何消息時遇到問題。MSMQ C++接收消息問題

此代碼示例取自MSDN並在少數地方進行了修改。 下面是代碼:

// Define the required constants and variables. 
const int NUMBEROFPROPERTIES = 5; 
DWORD cPropId = 0; 
HRESULT hr = MQ_OK;         // Return code 
ULONG ulBufferSize = 256; 

// Define an MQMSGPROPS structure. 
MQMSGPROPS msgprops; 
MSGPROPID aMsgPropId[NUMBEROFPROPERTIES]; 
MQPROPVARIANT aMsgPropVar[NUMBEROFPROPERTIES]; 
HRESULT aMsgStatus[NUMBEROFPROPERTIES]; 

// Specify the message properties to be retrieved. 
aMsgPropId[cPropId] = PROPID_M_LABEL_LEN;   // Property ID 
aMsgPropVar[cPropId].vt = VT_UI4;     // Type indicator 
aMsgPropVar[cPropId].ulVal = MQ_MAX_MSG_LABEL_LEN; // Length of label 
cPropId++; 

WCHAR wszLabelBuffer[MQ_MAX_MSG_LABEL_LEN];   // Label buffer 
aMsgPropId[cPropId] = PROPID_M_LABEL;    // Property ID 
aMsgPropVar[cPropId].vt = VT_LPWSTR;    // Type indicator 
aMsgPropVar[cPropId].pwszVal = wszLabelBuffer;  // Label buffer 
cPropId++; 

UCHAR * pucBodyBuffer = NULL; 
pucBodyBuffer = (UCHAR*)malloc(ulBufferSize); 
if (pucBodyBuffer == NULL) 
{ 
    return MQ_ERROR_INSUFFICIENT_RESOURCES; 
} 
memset(pucBodyBuffer, 0, ulBufferSize); 
aMsgPropId[cPropId] = PROPID_M_BODY_SIZE;   // Property ID 
aMsgPropVar[cPropId].vt = VT_NULL;     // Type indicator 
cPropId++; 

aMsgPropId[cPropId] = PROPID_M_BODY;    // Property ID 
aMsgPropVar[cPropId].vt = VT_VECTOR | VT_UI1;  // Type indicator 
aMsgPropVar[cPropId].caub.pElems = (UCHAR*)pucBodyBuffer; // Body buffer 
aMsgPropVar[cPropId].caub.cElems = ulBufferSize; // Buffer size 
cPropId++; 

aMsgPropId[cPropId] = PROPID_M_BODY_TYPE;   // Property ID 
aMsgPropVar[cPropId].vt = VT_NULL;     // Type indicator 
cPropId++; 


// Initialize the MQMSGPROPS structure. 
msgprops.cProp = cPropId;       // Number of message properties 
msgprops.aPropID = aMsgPropId;      // IDs of the message properties 
msgprops.aPropVar = aMsgPropVar;     // Values of the message properties 
msgprops.aStatus = aMsgStatus;      // Error reports 

    // HERE IS THE ERROR 
hr = MQReceiveMessage(
         this->readHandle,      // Queue handle 
         // Max time to (msec) to receive the message 
         // wait soooooo much 
         INFINITE,      
         MQ_ACTION_RECEIVE   // Receive action 
         &msgprops,     // Message property structure 
         NULL,      // No OVERLAPPED structure 
         NULL,      // No callback function 
         NULL,      // No cursor handle 
         MQ_NO_TRANSACTION   // Not in a transaction 
        ); 

// log reading operation result 
f<<"log receive operation"<<endl; 
f<<hex<<hr<<endl; 
f.close(); 

if (hr == MQ_ERROR_BUFFER_OVERFLOW) 
{ 
    //MessageBox(NULL, TEXT("buffer overflow"), TEXT("Message"), MB_OK); 

    ulBufferSize = aMsgPropVar[2].ulVal*sizeof(UCHAR); 
    pucBodyBuffer = (UCHAR*)realloc(pucBodyBuffer, ulBufferSize); 
    if (pucBodyBuffer == NULL) 
    { 
    return MQ_ERROR_INSUFFICIENT_RESOURCES; 
    } 
    memset(pucBodyBuffer, 0, ulBufferSize); 
    aMsgPropVar[3].caub.pElems = (UCHAR*)pucBodyBuffer; 
    aMsgPropVar[3].caub.cElems = ulBufferSize; 
} 

在指令 「MQReceiveMessage」 我得到 「MQ_ERROR_ILLEGAL_PROPERTY_VALUE」 錯誤代碼。

任何人都可以看看我的代碼,並告訴我什麼是錯的,什麼屬性是非法的?

謝謝,

回答

1

錯誤代碼表明您請求的屬性無效。我的猜測是設置aMsgPropVar[cPropId].vt = VT_NULL;對於Body Size和Body Type是錯誤的 - MDSN文檔指示都具有VT_UI4類型 - 例如參見here

+0

它工作。在[this](http://msdn.microsoft.com/zh-cn/library/ms706009%28v=VS.85%29.aspx)示例中遇到了問題。謝謝 – 2011-04-28 00:15:51

+0

太棒了,很高興你再次滾動 – 2011-04-28 10:56:06