Q&A

  • Variant를 Record로 변환..
type
  _ST_LOGIN = Record
    room : char;
    init : char;
    tmp : array[0..6] of char;
  end;
.
.
.

var
  st_login,st : _ST_LOGIN;
  V: Variant;
begin
  st_login.room := 'M';
  st_login.init := 'T';

  VarClear(V);
  TVarData(V).VType := varByRef;
  TVarData(V).VPointer := @st_login;
.
.
.
이런식으로 Record를 변환해서 상대편(C++)에서 잘받습니다.
그런데 델파이쪽에서 다시 저런식으로 보낸 데이터를 레코드에
넣는것에 대한자료를 찾기가 힘들더군요...

누구 아시는분 조언좀 해주세요~
1  COMMENTS
  • Profile
    김유철 2003.07.14 01:13

    꼭 질문을 올리면 해결을 보는군요~ 자주 올려야 될듯~^^;;;

    우선 이 코딩이 필요했던 이유는 VC로 소켓 컴포넌트를 만들었는데

    데이터를 전달할때 구조체를 Variant로 만들어서 콤포넌트를 올린

    넘한테 전달하기 때문에 패킷내용을 볼려면 요넘을 풀어야만 볼수

    있었죠.. VB나 VC는 쉽게 레퍼런스를 구할수 있었지만..

    델파이는 영... ^^;;

    그래도 어케저케 아래의 코딩으로 해결 봤습니다~

    procedure TFRM_Main.Client_SocketReceiveData(Sender: TObject;
      SockNo: Smallint);
    var
      st_login : _ST_LOGIN;
      buff : PCHAR;
      V: Variant;
      stmode : smallint;
    begin
      V := Client_Socket.GetRecvData;
      buff := TVarData(V).VPointer; //<-C++에서 BYTE배열로 패킷을 만들었다
      CopyMemory(@stmode,@buff[0],2);
      if stmode = 101 then
      begin
        CopyMemory(@st_login,@buff[2],sizeof(_ST_LOGIN));
        if st_login.init = 'C' then
        begin
          st_login.room := MONITORING;
          Client_Socket.SetSendData(Client_Socket.GetMySocketNo,DF_LOGIN,VariantReturn(@st_login),sizeof(st_login));
        end;
      end;
    end;

    콤포넌트의 Recv이벤트 입니다(제가맹근부분)