0

我正在尝试使用 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.

我怎样才能正确地做到这一点?

提前致谢。

4

2 回答 2

1

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

于 2012-06-05T19:55:34.637 回答
0

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

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

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

于 2012-06-12T06:23:09.913 回答