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条评论
登录后参与评论

相关文章

来自分类Dev

ReadMsgQueue返回ERROR_INVALID_PARAMETER

来自分类Dev

WinHttpSendRequest返回ERROR_INVALID_PARAMETER

来自分类Dev

WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

来自分类Dev

WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

来自分类Dev

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

来自分类Dev

Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

来自分类Dev

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

来自分类Dev

带有FSCTL_SET_ZERO_DATA的DeviceIoControl返回ERROR_INVALID_PARAMETER

来自分类Dev

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

来自分类Dev

异步ReadDirectoryChangesW失败,错误码为ERROR_INVALID_PARAMETER

来自分类Dev

在服务器2012上使用MS加密库-CryptCreateHash错误代码87:ERROR_INVALID_PARAMETER

来自分类Dev

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

来自分类Dev

FindNextFileA返回6(ERROR_INVALID_HANDLE)

来自分类Dev

FindNextFileA返回6(ERROR_INVALID_HANDLE)

来自分类Dev

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

来自分类Dev

BCryptEncrypt在AES-GCM上返回STATUS_INVALID_PARAMETER

来自分类Dev

IDXGIFactory4 :: CreateSwapChain返回DXGI_ERROR_INVALID_CALL

来自分类Dev

VirtualAllocEx 失败 GetError 返回 ERROR_INVALID_ADDRESS

来自分类Dev

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

来自分类Dev

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

来自分类Dev

error MSB4102: The value "" of the "Project" attribute in element <Import> is invalid. Parameter "path" cannot have zero length. F#

来自分类Dev

Invalid Binary Error

来自分类Dev

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

来自分类Dev

PayPal沙箱IPN验证始终返回INVALID

来自分类Dev

NoCaptcha返回错误invalid-json

来自分类Dev

套接字始终返回INVALID_SOCKET

来自分类Dev

Error: invalid instruction suffix for `push'

来自分类Dev

CUDA invalid device symbol error

来自分类Dev

Invalid target for Validator in spring error?

Related 相关文章

  1. 1

    ReadMsgQueue返回ERROR_INVALID_PARAMETER

  2. 2

    WinHttpSendRequest返回ERROR_INVALID_PARAMETER

  3. 3

    WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

  4. 4

    WIN API ReadFile()返回GetLastError()ERROR_INVALID_PARAMETER

  5. 5

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

  6. 6

    Windows 读取文件返回 ERROR_INVALID_PARAMETER 87

  7. 7

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

  8. 8

    带有FSCTL_SET_ZERO_DATA的DeviceIoControl返回ERROR_INVALID_PARAMETER

  9. 9

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

  10. 10

    异步ReadDirectoryChangesW失败,错误码为ERROR_INVALID_PARAMETER

  11. 11

    在服务器2012上使用MS加密库-CryptCreateHash错误代码87:ERROR_INVALID_PARAMETER

  12. 12

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

  13. 13

    FindNextFileA返回6(ERROR_INVALID_HANDLE)

  14. 14

    FindNextFileA返回6(ERROR_INVALID_HANDLE)

  15. 15

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

  16. 16

    BCryptEncrypt在AES-GCM上返回STATUS_INVALID_PARAMETER

  17. 17

    IDXGIFactory4 :: CreateSwapChain返回DXGI_ERROR_INVALID_CALL

  18. 18

    VirtualAllocEx 失败 GetError 返回 ERROR_INVALID_ADDRESS

  19. 19

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

  20. 20

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

  21. 21

    error MSB4102: The value "" of the "Project" attribute in element <Import> is invalid. Parameter "path" cannot have zero length. F#

  22. 22

    Invalid Binary Error

  23. 23

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

  24. 24

    PayPal沙箱IPN验证始终返回INVALID

  25. 25

    NoCaptcha返回错误invalid-json

  26. 26

    套接字始终返回INVALID_SOCKET

  27. 27

    Error: invalid instruction suffix for `push'

  28. 28

    CUDA invalid device symbol error

  29. 29

    Invalid target for Validator in spring error?

热门标签

归档