- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
Windows 嵌入式紧凑型。
Trying to send and receive a message with MsgQueue.
看起来写入工作正常但读取给出了不正确的参数错误。
知道缺少什么吗?
我不确定创建队列函数。它说必须调用两次才能获得读取或写入句柄 - 对吗?
int main()
{
MSGQUEUEOPTIONS options = {0};
options.dwSize = sizeof(options); //
options.dwFlags = MSGQUEUE_NOPRECOMMIT;
options.dwMaxMessages = 10000; // msg max for queue
options.cbMaxMessage = 50; // max number of bytes in each msg
options.bReadAccess = TRUE; // read
HANDLE hRead = CreateMsgQueue(LPCWSTR("MSG_QUEUE"), &options);
if ( hRead == NULL )
{
printf("CreateMsgQueue hRead failed! Err code: %d\n", GetLastError());
}
// Thread A will read msg queue
HANDLE hTg = CreateThread(NULL, 0, threadA, hRead, 0, 0);
if ( NULL == hTg )
{
printf("CreateThread failed - A!\n");
return 1;
}
Sleep(1000); //give time before sending msg
options.bReadAccess = FALSE; // write to
HANDLE hWrte = CreateMsgQueue(LPCWSTR("MSG_QUEUE"), &options);
if ( hWrte == NULL )
{
printf("CreateMsgQueue hWrte failed! Err code: %d\n", GetLastError());
}
// Thread B write to queue
HANDLE hTt = CreateThread(NULL, 0, threadB, hWrte, 0, 0);
if ( NULL == hTt )
{
printf("CreateThread failed - B!\n");
return 1;
}
// quit on <ENTER> key
getchar();
}
DWORD WINAPI threadB(LPVOID lpParameter)
{
HANDLE msgH = HANDLE(lpParameter);
if ( msgH == NULL)
{
printf("Null handle in write!\n");
}
char message[10] = "ABCDEFGHI";
printf("Size of message sent: %d bytes\n", sizeof(message));
// know that a queue is not full and that it's safe to write
WaitForSingleObject(msgH, INFINITE);
BOOL ret = WriteMsgQueue(
msgH,
&message,
sizeof(message),
INFINITE,
NULL);
if ( ret == FALSE )
{
printf("WriteMsgQueue failed! Err code: %d\n", GetLastError());
}
return 0;
}
DWORD WINAPI threadA(LPVOID lpParameter)
{
HANDLE hQ = HANDLE(lpParameter);
if ( hQ == NULL )
{
printf("null handle in read!\n");
}
char readIn[50] = {0};
LPDWORD numRead = 0;
//DWORD flag;
// need to wait on sinfle object
WaitForSingleObject(hQ, INFINITE);
BOOL ret = ReadMsgQueue(
hQ,
&readIn,
DWORD(sizeof(readIn)),
numRead,
INFINITE,
NULL
);
if ( ret == FALSE )
{
printf(" ReadMsgQueue failed! Err code: %d\n", GetLastError());
}
printf("Size received: %d\n", numRead);
printf("Msg Received: %s\n", readIn);
return 0;
}
编辑
这是在@WhozCraig 之后的工作读取函数和发现的另一个问题,以防其他人需要它:
DWORD WINAPI threadA(LPVOID lpParameter)
{
HANDLE hQ = HANDLE(lpParameter);
if ( hQ == NULL )
{
printf("null handle in read!\n");
}
char readIn[50] = {0};
DWORD numRead = 0;
DWORD flag;
// need to wait on sinfle object
WaitForSingleObject(hQ, INFINITE);
BOOL ret = ReadMsgQueue(
hQ,
&readIn,
sizeof(readIn),
&numRead,
INFINITE,
&flag
);
if ( ret == FALSE )
{
printf(" ReadMsgQueue failed! Err code: %d\n", GetLastError());
}
printf("Size received: %d\n", numRead);
printf("Msg Received: %s\n", readIn);
return 0;
}
最佳答案
是的,这就是您为发送/接收设置消息队列的方式。一般采用二开。
我相信你的问题ReadMsgQueue()
invocation 是接收到的大小参数。它是一个 LPDWORD,不能为 NULL。你目前正在这样做:
char readIn[50] = {0};
LPDWORD numRead = 0; // SHOULD NOT BE A POINTER
// need to wait on sinfle object
WaitForSingleObject(hQ, INFINITE);
BOOL ret = ReadMsgQueue(
hQ,
&readIn,
DWORD(sizeof(readIn)),
numRead, // THIS IS A PROBLEM
INFINITE,
NULL
);
您正在传递 NULL。您需要这样做:
char readIn[50] = {0};
DWORD numRead = 0; // NOTE: regular DWORD
// need to wait on sinfle object
WaitForSingleObject(hQ, INFINITE);
BOOL ret = ReadMsgQueue(
hQ,
&readIn,
DWORD(sizeof(readIn)),
&numRead, // NOTE: address of DWORD
INFINITE,
NULL
);
我不清楚最后一个参数,received message flags out-paramter 是否可以为 NULL。它没有像读取大小的 DWORD 地址那样在文档中被特别调用,它明确指出 This parameter cannot be NULL
,其他参数也是如此。所以你的里程可能会有所不同。
关于c# - ReadMsgQueue 返回 ERROR_INVALID_PARAMETER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20026796/
我正在尝试通过 wifi 连接将数据发送到接收器以进行实验。我设法使用适用于 wifi 的 Windows API Native 将卡连接到接收器。 我将卡的 GUID 存储在 pIfInfo 指针
我正在尝试使用 ReadFile 函数。这是我的代码: #define BUFFERSIZE 5 int main(int argc, char* argv[]) { OVERLAPPED o
我正在尝试执行 SetIpInterfaceEntry功能,但我总是得到 ERROR_INVALID_PARAMETER 结果。我想更改哪个确切参数并不重要,因为即使我不更改任何内容,我也会收到此错误
我使用 visual studio 2008 service pack1(9.0.30729.1)、windows 7 professional 64 位和 8 GB 内存运行我的应用程序 我的应用程
我的目标是从集群中获取文件名。为此,我使用函数 FSCTL_LOOKUP_STREAM_FROM_CLUSTER。使用它时,我收到错误 87,根据 MSDN,它代表 ERROR_INVALID_PAR
我正在尝试获取 betfair API使用 Windows API。 我无法尝试使用以下代码登录(用户名和密码已更改)。 char *headers = "X-Application: MakJhSA
在尝试读取和获取事件日志中的事件数时,出现错误 87。 #include #include #include #define PROVIDER_NAME "System" void wmain(
Windows 嵌入式紧凑型。 Trying to send and receive a message with MsgQueue. 看起来写入工作正常但读取给出了不正确的参数错误。 知道缺少什么吗
CryptHashData ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa380202(v=vs.85).aspx) 一直返
重现我的问题的示例代码: #include #include int main() { using namespace std; HANDLE hdl = CreateFile("test
此代码在 Windows 7 上启动时完全没问题: HANDLE hVol = CreateFile(L"\\\\.\\c:", GENERIC_WRITE | GENERIC_READ,
我为 NtWriteFile 做了一个简单的包装,但我遇到了来自 NtWriteFile 的错误。这是我的代码: BOOL WINAPI WriteFile(HANDLE hFile, PVOID l
DnsQueryConfig的文档在这里: https://docs.microsoft.com/en-us/windows/win32/api/windns/nf-windns-dnsqueryco
我一直在开发一个使用 winapi 获取管理员组成员的应用程序。为此,我使用了 NetLocalGroupGetMembers 方法。我的问题是当我尝试释放缓冲区的堆空间时,我从 NetApiBuff
我的程序创建了一个邮槽,但是当我调用 ReadFile 时,我得到了 ERROR_INVALID_PARAMETER。 参数不对怎么办? 程序代码: SECURITY_DESCRIPTOR sd;
我在调用 AttachThreadInput() 时得到一个 ERROR_INVALID_PARAMETER 错误代码。这是代码块: HWND hwnd = MYFINDWINDOW::FindWin
我正在尝试使用 LsaCallAuthenticationPackage 从缓存中清除特定票证。我总是在包状态中得到 ERROR_INVALID_PARAMETER 87。可能是什么原因?这是我的
我在下面编写了这段代码,它在 code::blocks 下运行良好,使用 mingw gcc 4.7 进行编译。从那以后,我决定开始使用 Visual Studio 2013 Express。现在调用
我正在调用 Windows 事件跟踪 StartTrace功能: StartTrace(sessionHandle, KERNEL_LOGGER_NAME, sessionProperties); 失
我正在尝试使用 EvtQuery 读取 Windows 事件日志和 winapi crate . 我收到系统错误 87 - ERROR_INVALID_PARAMETER fn to_vec(str:
我是一名优秀的程序员,十分优秀!