Q&A

  • WM_COPYDATA 메세지를 받는 부분에서 문자열이 짤리네요 ㅠㅠ

수신부분
{*********************************************************
명칭: RxWindowHook1AfterMessage
목적: 수신쓰레드에서 받은 메세지를 처리하는 함수
내용: 1. 메세지를 Case별로 분기하여 준다.
*********************************************************}
<!--
procedure TfrmRoomList.RxWindowHook1AfterMessage(Sender: TObject;
  var Msg: TMessage; var Handled: Boolean);
var
  RcvStr : String;
  sType  : String;
begin
  case Msg.Msg of
    WM_COPYDATA :
      begin
        RcvStr := StrPas(PChar(PCopyDataStruct(Msg.LParam)^.lpData));
        sType := Copy( RcvStr, 3, 5 );
        if sType = REP_CHAT_SERVER then SetChatServerInfo( RcvStr )
        else if sType = REP_CHAT_ROOMINFO then GetRoomInfo( RcvStr )
        else if sType = REP_CHAT_MAKE_ROOM then AddRoom( RcvStr );
                
    end;
  end;
end;
-->

==================================================================

송신부분
<--
procedure TClientRecvThread.RecvPacketEX;
var
  DataBuf  : TCopyDataStruct;

  nLen     : Integer;
begin
  //

  SndStr := FMessage;
  nLen   := Length(SndStr) + 1;
  SndStr := SndStr + #0;  //종료문자열 추가해줘야 함

  with DataBuf do
  begin
    DwData := 9;
    cbData := nLen;
    lpData := pChar(SndStr);
  end;

  SendMessage(FHandle, WM_COPYDATA, 0, LPARAM(@DataBuf));
end;
-->

수신부와 송신부 소스입니다....

무슨 이유인지 보내는 부분에서는 디버깅으로 데이터를 확인했는데 이상없이 보내고 있습니다.

그런데 받는 부분에서 일부분만 넘어오네요...

ㅠㅠ

이유를 잘 모르겠습니다...

고수님들 좀 도와주세요~~

참고로 저 문자열은 소켓으로 받은 데이터입니다....^^

즐프하세요~
2  COMMENTS
  • Profile
    장성호 2008.09.19 21:08
    정확한 이유를 설명하기는 지식이 딸리고...


    String을 WM_COPYDATA로 다른 Application에 전달하려고 한다면
    그냥 PChar로 하지 마시구요

    char 버퍼를 잡아서 그 버퍼에다가 String의 내용을 copy하신후에
    char버퍼의 포인터를 WM_COPYDATA로 넘기세요


  • Profile
    이강석 2008.09.23 23:29
    제가 잘못했네요..감사합니다..