通过管道发送struct数组:win32,C

时间:2012-06-05 19:42:37

标签: c windows pipe named-pipes

我正在尝试使用win32中的管道从一个应用程序发送一个* var,实际上是一个4个插槽的数组。我怎么能正确地做到这一点?

据我所知,我正确地做到了:

    //sending like this:
    if (!WriteFile(hPipeWriteGhosts[i],Ghosts, (DWORD) sizeof(map)*4, &n, NULL)) 
                {  
                    printf("[ERROR] Writing in the pipe... (WriteFile)\n");
                    exit(1);
                }


    //receiving like this
    ret = ReadFile(HReadSPipe, Ghosts, sizeof(map)*4, &n, NULL);   // Lê até ao numero de bytes for zero (pipe fechado) pk o cliente escreveu fim e n escreveu mais nada
        if (!ret || !n)
            MessageBox(hDlgGlobal, str, "Error", MB_YESNO | MB_ICONINFORMATION);  // But in fact it shows me this all the time.

我该如何正确地做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:1)

好的,你的问题是你在跨进程边界移动句柄和指针。您的map包含char *HBITMAP。您传输char *值,但不传输它指向的数据。您传输位图的句柄,但不传输实际的位图。

答案 1 :(得分:0)

您需要传输结构图中包含的物理数据。

通常,我使用字节数组通过管道传输数据。对于像结构或对象这样的数据项,最好将结构或对象的各个数据成员复制到字节数组中,如果你有例如嵌套结构或包含字符串的数组或任何其他非数据类型,也可能递归地复制固定大小。 然后在管道的另一端根据字节数组中接收的数据重建结构或对象。对于任何没有固定大小的数据,例如int,我将该项的大小写入字节数组,然后是数据本身。

此外,如果它似乎没有在服务器端正确读取,或者可能无法在客户端正确写入,请向我们发送任何正在发生的运行时错误(如果有的话)并告诉我们您是如何声明的并建立你的缓冲变量,鬼。例如,您确定不会无意中转移结束缓冲区位置而不是起始位置吗?