简体   繁体   English

MSMQ c++ 接收消息问题

[英]MSMQ c++ receive message problem

I am trying to read messages from a MSMQ queue in c++.我正在尝试从 c++ 中的 MSMQ 队列中读取消息。 The queue is successfully open, but I am having problems reading any message from it.队列已成功打开,但我在从中读取任何消息时遇到问题。

This code sample is taken from MSDN and modified in a few places.此代码示例取自 MSDN,并在一些地方进行了修改。 Here is the code:这是代码:

// 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;
}

At the instruction "MQReceiveMessage" i get "MQ_ERROR_ILLEGAL_PROPERTY_VALUE" error code.在“MQReceiveMessage”指令中,我得到“MQ_ERROR_ILLEGAL_PROPERTY_VALUE”错误代码。

Can anyone look over my code and tell me what is wrong, what property is illegal?谁能查看我的代码并告诉我哪里出了问题,哪些财产是非法的?

Thanks,谢谢,

The error code indicates that the properties you requested are invalid.错误代码表示您请求的属性无效。 My guess is that setting aMsgPropVar[cPropId].vt = VT_NULL;我的猜测是设置aMsgPropVar[cPropId].vt = VT_NULL; is wrong for Body Size and Body Type - the MDSN docs indicate both have type VT_UI4 - see here , for example. Body Size 和 Body Type 是错误的 - MDSN 文档表明两者都有类型 VT_UI4 - 例如,请参见此处

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM