我试图发送(理想情况下)从一个进程到另一个2d缓冲区,通过Message Queue,但我试图首先使用1d缓冲区。通过消息队列发送缓冲区
调用以初始化队列中的功能如下:
HANDLE MsgQueueCommunicator::InitMessageQueue_data(bool IsRead,wchar16_t* wQueueName)
{
MSGQUEUEOPTIONS msgopts;
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = MSGQUEUE_ALLOW_BROKEN;//0;
msgopts.dwMaxMessages = 0;
msgopts.cbMaxMessage = sizeof(data[20]);
msgopts.bReadAccess = IsRead;
HANDLE hq = CreateMsgQueue(wQueueName, &msgopts);
if (hq == NULL)
{
return NULL;
}
return hq;
}
队列初始化过程1:
HANDLE hMsgQueueR = MsgQueueCommunicator::getInstance()->InitMessageQueue_data(true, L"CommDataStreaming");
队列初始化过程2:
HANDLE s_hMsgQueue_Communication = MsgQueueCommunicator::getInstance()->InitMessageQueue_data(false,L"CommDataStreaming");
要写入到队列中,我呼叫以下功能:
BOOL MsgQueueCommunicator::Write_Array_To_Queue(HANDLE hq,double data[20])
{
return WriteMsgQueue(hq,(LPVOID)&data, sizeof(data),INFINITE,0);
}
MsgQueueCommunicator::getInstance()->Write_Array_To_Queue(s_hMsgQueue_Communication, usb_data);
其中usb_data
是1d双数组。
为了从队列中读取,我调用以下函数:
BOOL MsgQueueCommunicator::Read_Array_From_Msg_Queue(HANDLE hq,double data[20])
{
DWORD dwBytesRead;
DWORD dwFlags;
return ReadMsgQueue(hq, (LPVOID)&data, sizeof(data), &dwBytesRead, INFINITE, &dwFlags);
}
MsgQueueCommunicator::getInstance()->Read_Array_From_Msg_Queue(hMsgQueueR, usb_data);
usb_data
哪里再次是一维阵列双。
现在,当我检查在写入队列之前放入usb_data[20]
的值时,我可以看到它们是非零整数。但是,当我从队列中读取数组并检查其值时,它们为零。林不知道是什么原因造成这个问题。我使用消息队列发送单个值,字符串和结构,所以我想我可以按照相同的过程发送数组,但这似乎并不是这样,除非我忽略了某些东西。
我的问题是,我可以通过消息队列发送数组/缓冲区,如果是,我可以正确设置它吗?
注:这是在Windows嵌入式紧凑型7环境和VS2008中开发的。
dwBytesRead是否返回期望值(20,我猜?)。我怀疑ReadMsgQueue中的sizeof(data),因为它可能会返回指针的大小,即4而不是20,但我不确定。 – walkingTarget
是否需要'(LPVOID)&data'?是不是'(LPVOID)数据',因为它已经是一个指向内存块的开始与双打? –
我同意@Rudolfs Bundulis。我想如果你结合我们的两个评论,你会看到成功。 – walkingTarget