C# ReadMsgQueue返回错误\u无效\u参数

C# ReadMsgQueue返回错误\u无效\u参数,c#,c++,c,windows,windows-ce,C#,C++,C,Windows,Windows Ce,Windows嵌入式Compact 看起来写操作正在进行,但读操作给出了错误的参数错误 你知道缺少什么吗 我不确定createqueue函数。它说必须调用它两次才能获得读或写句柄-是这样吗 int main() { MSGQUEUEOPTIONS options = {0}; options.dwSize = sizeof(options); // options.dwFlags = MSGQUEUE_NOPRECOMM

Windows嵌入式Compact

看起来写操作正在进行,但读操作给出了错误的参数错误

你知道缺少什么吗

我不确定createqueue函数。它说必须调用它两次才能获得读或写句柄-是这样吗

    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;
}
两件事:

1) 是:如果要读和写,那么必须调用CreateMsgQueue两次:第一次用于只读句柄,第二次用于(不同的!)只读句柄

2) 您的缓冲区是
lpBuffer
。如果声明“char message[10];”,则必须传递
消息
,而不是
消息


3) 出于同样的原因,您必须通过
readIn
,而不是
&readIn
。我猜这可能是您的错误\u无效\u参数的原因。

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

我认为调用的问题在于接收的大小参数。它是LPDWORD,并且不能为空。您当前正在执行以下操作:

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
    );
你正在传递空值。您需要这样做:

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参数是否可以为NULL。文档中并没有像读取DWORD地址的大小那样专门调用它,它清楚地说明了
此参数不能为NULL
,其他参数也是如此。因此,您的里程数可能会有所不同。

启动两个线程后,停止
main()
并返回程序终止的原因是什么?尽我所能接近。。没有什么。您可能需要等待这两个已创建的线程句柄。@whozcraig:抱歉,试图取出额外的内容。我已//按getchar()键退出;对于#2和#3,两者都不是必需的。该参数是一个LPVOID。给定
字符消息[10]
,则
消息
消息
的地址都是相同的。只是类型不同。(一个是
字符*
,另一个是
字符(*)[10]
在这两种情况下,类型在translate-through
void*
上丢失。如果
消息是指针而不是固定数组,则完全正确。也就是说,查看接收大小DWORD通过地址传递的读取大小。它是空指针,不可能。我相信这是真正的问题。他通过了将NULL作为LPDWORD大小接收器,并根据文档,“存储在lpBuffer中的字节数。此参数不能为NULL。”@whozcraig:NULL用于标志-最后一个参数。读取大小不是第三个参数sizeof(消息)?@paulsm4:好的,谢谢你的#1,我想我用相同的名字做对了,然后只更改了bReadAccess参数…?@P.S.read size是你提供的缓冲区空间量。它是第四个参数(实际读取了多少字节的结果)我相信这就是问题所在。是的,我没有实际运行它,但是10000英尺的视图看起来是正确的。你所要做的就是翻转访问标志。哦哦哦!克鲁德好眼睛,我对这些类型是新的,我忘了LP是长指针或其他东西,让我试试。有趣的是,我仍然有错误代码87。也许是sizeof()上的演员是不正确的…但是你指出的确实是一个问题…(我在该线程中的所有代码都是正在运行的)也许标志不能为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
    );