2012-06-05 4 views
0

사실, 하나의 응용 프로그램에서 다른 슬롯으로 win32의 파이프가있는 4 개의 슬롯 배열 인 * var을 보내려고합니다. 이 작업을 올바르게 수행하려면 어떻게해야합니까?파이프를 통해 구조체 배열 보내기 : 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

아 미안 유령은 *지도 구조체지도 { \t INT X, XB이다; \t int y, yb; \t HBITMAP bitm; \t int TypeOfMessage; \t char * BelongToUser; // 객체 소유자를 식별합니다 (이 객체가 GG 인 경우) \t char 유형 [1]; // 무의미한 0, 비트 맵 업데이트 1 개, 다른 것들 }; 그것을거야 가게를 sizeof (지도) * 4 –

+0

이 .. 유령이 사실이이 잘못된 것을 생각하게는 sizeof (지도) * 4 –

답변

0

구조체 맵에 포함 된 실제 데이터를 전송해야합니다.

일반적으로 파이프를 통해 데이터를 전송하기 위해 바이트 배열을 사용합니다. 구조체 또는 객체와 같은 데이터 항목의 경우 구조체 또는 객체의 개별 데이터 멤버를 바이트 배열로 복사하는 것이 좋습니다. 예를 들어 중첩 구조체 나 문자열이 포함 된 배열 또는 비어있는 기타 데이터 유형이있는 경우 반복적으로 사용할 수도 있습니다. 고정 크기. 그런 다음 파이프의 다른 쪽 끝에서 바이트 배열에 수신 된 데이터를 기반으로 구조체 또는 개체를 다시 작성합니다. int와 같은 고정 크기가없는 모든 데이터의 경우 해당 항목의 크기를 바이트 배열에 쓴 다음 데이터 자체를 씁니다.

또한 서버 측에서 올바르게 읽지 못하거나 클라이언트 측에서 올바르게 쓰지 않는 것 같으면 어떤 런타임 오류가 발생했는지 알려 주시고 어떻게 나타나는지 알려주십시오. 버퍼 변수, 유령을 선언하고 작성합니다. 예를 들어, 시작 위치 대신에 최종 버퍼 위치를 우연히 전송하지 않았습니까?

1

좋습니다, 문제는 프로세스 경계를 ​​넘어 핸들과 포인터를 이동한다는 것입니다. map에는 char *HBITMAP이 포함되어 있습니다. char * 값을 전송하지만 데이터가 가리키는 값은 전송하지 않습니다. 비트 맵 핸들을 전송하지만 실제 비트 맵은 전송하지 않습니다.

+0

예, 비트 맵은 현재 NULL입니다. 그게 문제 야? –

+0

NULL은 어디에서나 NULL이므로 NULL입니다. char 포인터는 어떨까요? – zmbq

+0

나는 BelongToUser char로 바꿨다. 그리고 strcpy (Ghosts [i] .BelongToUser, "randomWord") 만했다. –