ReadMsgQueue返回ERROR_INVALID_PARAMETER

聚苯乙烯

Windows Embedded Compact。

尝试使用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;
}
WhozCraig

是的,这就是您设置发送/接收消息队列的方式。通常使用两个打开。

我相信您ReadMsgQueue()调用的问题是接收大小参数。它是一个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
    );

我不清楚最后一个参数(接收到的消息标志超出参数)是否可以为NULL。在文档中没有像在This parameter cannot be NULL其他参数中明确指出的那样,像读取大小的DWORD地址那样明确地调用它因此,您的里程可能会有所不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android的AudioRecord读总是返回-3(ERROR_INVALID_OPERATION)

Unity广告返回INVALID_ARGUMENT

通过火狐浏览器访问时,https Azure网站返回SEC_ERROR_OCSP_INVALID_SIGNING_CERT

google服务帐户示例返回“刷新OAuth2令牌时发生错误{“ error”:“ invalid_grant”}“

NoCaptcha返回错误invalid-json

PayPal沙箱IPN验证始终返回INVALID

listStatus的INVALID_REQUEST_PARAMETER

SetThreadDesktop:ERROR_INVALID_HANDLE

UEFI引导服务CreateEvent()返回状态EFI_INVALID_PARAMETER

套接字始终返回INVALID_SOCKET

wintun:注册环形缓冲区时出现ERROR_INVALID_PARAMETER

禁用快速编辑模式时,SetConsoleMode返回ERROR_INVALID_PARAMETER

BCryptEncrypt在AES-GCM上返回STATUS_INVALID_PARAMETER

异步ReadDirectoryChangesW失败,错误码为ERROR_INVALID_PARAMETER

FindNextFileA返回6(ERROR_INVALID_HANDLE)

WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

响应通知POST,供应商系统返回INVALID或ERROR-Sagepay服务器

IDXGIFactory4 :: CreateSwapChain返回DXGI_ERROR_INVALID_CALL

查询蓝牙设备时,SetupDiEnumDeviceInterfaces返回ERROR_INVALID_PARAMETER

带有FSCTL_SET_ZERO_DATA的DeviceIoControl返回ERROR_INVALID_PARAMETER

Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

Jenkins 2.60.2 在运行 Gradle 任务时返回“CreateProcess error=267, The directory name is invalid”

VirtualAllocEx 失败 GetError 返回 ERROR_INVALID_ADDRESS

将 EvtQuery 与 winapi crate 一起使用时,为什么会出现 ERROR_INVALID_PARAMETER?

RegCreateKeyExA 函数返回 ERROR_INVALID_PARAMETER(错误代码 87)

我的 jwt 不记名令牌通过邮递员返回 error="invalid_token", error_description="The token expired"

如何解决 responseJSON: {error: "invalid_request", error_description: "Missing required parameter: code"}

Python ctypes EnumThreadWindows 失败,错误 87 (ERROR_INVALID_PARAMETER)

Error Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in.. (path)