ошибка времени выполнения — доступ к MSMQ из кода C ++ (не COM-компонента)

Я новичок в концепции MSMQ (очереди сообщений Microsoft). Я имел представление о примере кода из Ссылка Microsoft и я пытаюсь создать простую очередь MSMQ. Вот мой полный код (в основном по ссылке Microsoft).

#include "stdafx.h"#include "windows.h"#include "mq.h"#pragma comment (lib, "Mqrt.lib")
#include "tchar.h"#include <stdio.h>
#define BUFLEN = 256;#include <iostream>

HRESULT CreateMSMQQueue(
LPWSTR wszPathName,
PSECURITY_DESCRIPTOR pSecurityDescriptor,
LPWSTR wszOutFormatName,
DWORD *pdwOutFormatNameLength
)
{

// Define the maximum number of queue properties.
const int NUMBEROFPROPERTIES = 2;// Define a queue property structure and the structures needed to initialize it.
MQQUEUEPROPS   QueueProps;
MQPROPVARIANT  aQueuePropVar[NUMBEROFPROPERTIES];
QUEUEPROPID    aQueuePropId[NUMBEROFPROPERTIES];
HRESULT        aQueueStatus[NUMBEROFPROPERTIES];
HRESULT        hr = MQ_OK;// Validate the input parameters.
if (wszPathName == NULL || wszOutFormatName == NULL || pdwOutFormatNameLength == NULL)
{
return MQ_ERROR_INVALID_PARAMETER;
}// Set queue properties.
DWORD cPropId = 0;
aQueuePropId[cPropId] = PROPID_Q_PATHNAME;
aQueuePropVar[cPropId].vt = VT_LPWSTR;
aQueuePropVar[cPropId].pwszVal = wszPathName;
cPropId++;

WCHAR wszLabel[MQ_MAX_Q_LABEL_LEN] = L"Test Queue";
aQueuePropId[cPropId] = PROPID_Q_LABEL;
aQueuePropVar[cPropId].vt = VT_LPWSTR;
aQueuePropVar[cPropId].pwszVal = wszLabel;
cPropId++;// Initialize the MQQUEUEPROPS structure.
QueueProps.cProp = cPropId;               // Number of properties
QueueProps.aPropID = aQueuePropId;        // IDs of the queue properties
QueueProps.aPropVar = aQueuePropVar;      // Values of the queue properties
QueueProps.aStatus = aQueueStatus;        // Pointer to the return status// Call MQCreateQueue to create the queue.
WCHAR wszFormatNameBuffer[256];
DWORD dwFormatNameBufferLength = 256;hr = MQCreateQueue(pSecurityDescriptor,         // Security descriptor
&QueueProps,                 // Address of queue property structure
wszFormatNameBuffer,         // Pointer to format name buffer
&dwFormatNameBufferLength);  // Pointer to receive the queue's format name length in Unicode characters not bytes.// Return the format name if the queue is created successfully.

if (hr == MQ_OK || hr == MQ_INFORMATION_PROPERTY)
{
if (*pdwOutFormatNameLength >= dwFormatNameBufferLength)
{
wcsncpy_s(wszOutFormatName, *pdwOutFormatNameLength - 1, wszFormatNameBuffer, _TRUNCATE);

wszOutFormatName[*pdwOutFormatNameLength - 1] = L'\0';
*pdwOutFormatNameLength = dwFormatNameBufferLength;
}
else
{
wprintf(L"The queue was created, but its format name cannot be returned.\n");
}
}
return hr;

}int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<"started!";
LPWSTR sam = L".\\myQueue";
LPWSTR out_name = L"Sampleoutput";
DWORD d1 = 60;
DWORD *dd = &d1;
HRESULT hs = CreateMSMQQueue(sam,pt,out_name,dd);
return 0;
}

Я не сильно изменил код. Когда я запускаю этот код, я получаюПриложение не может запуститься правильно (0x0000142)«ошибка. Отладкой я выяснил, что это из-за»Ошибка доступа к памяти«но нет никаких намеков на то, где это происходит. Пожалуйста, помогите мне!

Есть ли какой-нибудь формат для имен очередей? Или имя выходного формата?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]