我正在尝试使用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.
我该如何正确地做到这一点?
提前致谢。
答案 0 :(得分:1)
好的,你的问题是你在跨进程边界移动句柄和指针。您的map
包含char *
和HBITMAP
。您传输char *
值,但不传输它指向的数据。您传输位图的句柄,但不传输实际的位图。
答案 1 :(得分:0)
您需要传输结构图中包含的物理数据。
通常,我使用字节数组通过管道传输数据。对于像结构或对象这样的数据项,最好将结构或对象的各个数据成员复制到字节数组中,如果你有例如嵌套结构或包含字符串的数组或任何其他非数据类型,也可能递归地复制固定大小。 然后在管道的另一端根据字节数组中接收的数据重建结构或对象。对于任何没有固定大小的数据,例如int,我将该项的大小写入字节数组,然后是数据本身。
此外,如果它似乎没有在服务器端正确读取,或者可能无法在客户端正确写入,请向我们发送任何正在发生的运行时错误(如果有的话)并告诉我们您是如何声明的并建立你的缓冲变量,鬼。例如,您确定不会无意中转移结束缓冲区位置而不是起始位置吗?