2012-06-05 37 views
0

我试图发送一个* var,实际上是一个4槽阵列,从一个应用程序发送到另一个管道在win32中。我怎样才能正确地做到这一点?通过管道发送结构数组:win32,C

据我所知,我在做正确:

//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

那些'鬼'是什么? – zmbq

+0

Oh sorry Ghosts is a * map struct map { \t int x,xb; \t int y,yb; \t HBITMAP bitm; \t int TypeOfMessage; \t char * BelongToUser; //标识对象所有者(如果该对象是GG) \t char type [1]; // 0无关,1位图更新,其他东西 }; 它将存储sizeof(地图)* 4 –

+0

它只是一个指向结构图的指针..鬼是sizeof(map)* 4 –

回答

0

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

通常,我使用字节数组通过管道传输数据。对于像结构体或对象这样的数据项,最好将结构体或对象的单个数据成员复制到字节数组中,如果嵌套了结构体或包含字符串的数组或包含字符串的数组,固定大小。 然后在管道的另一端根据字节数组中收到的数据重建结构或对象。对于任何不具有固定大小(如int)的数据,我将该项的大小写入字节数组,然后是数据本身。另外,如果它在服务器端看起来没有正确读取,或者可能无法在客户端正确写入,请将发生的任何运行时错误(如果有的话)发送给我们,并告诉我们您是如何声明并建立你的缓冲变量ghost。例如,您确定不是无意中传输结束缓冲区位置而不是开始位置吗?

1

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

+0

是的,但现在位图为NULL。那是问题吗? –

+0

NULL到处都是NULL,所以没有。怎么样的字符指针? – zmbq

+0

我把它改成了char BelongToUser [20],然后我只做了strcpy(Ghosts [i] .BelongToUser,“randomWord”); –