MSMQ c ++接收消息问题

时间:2011-04-27 15:23:32

标签: c++ msmq

我正在尝试用c ++中的MSMQ队列读取消息。 队列已成功打​​开,但我在阅读任何消息时遇到问题。

此代码示例取自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 个答案:

答案 0 :(得分:1)

错误代码表示您请求的属性无效。我的猜测是,设置aMsgPropVar[cPropId].vt = VT_NULL;对于正文大小和正文类型是错误的 - MDSN文档指示两者都具有类型VT_UI4 - 例如,请参阅here