MSMQ c++接收消息问题

发布于 2024-11-03 09:02:59 字数 3702 浏览 2 评论 0原文

我正在尝试从 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”错误代码。

任何人都可以查看我的代码并告诉我哪里出了问题,哪些属性是非法的?

谢谢,

I am trying to read messages from a MSMQ queue in c++.
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.
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.

Can anyone look over my code and tell me what is wrong, what property is illegal?

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

余生共白头 2024-11-10 09:02:59

该错误代码表明您请求的属性无效。我的猜测是,设置 aMsgPropVar[cPropId].vt = VT_NULL; 对于 Body Size 和 Body Type 来说是错误的 - MDSN 文档表明两者都有类型 VT_UI4 - 请参阅 此处,用于 例子。

The error code indicates that the properties you requested are invalid. My guess is that setting 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文