课程设计做个系统,我用delphi写界面,调用同学用c写的dll。  
dll里有个函数,返回一个结构体,结构体里有个char[256],我在delphi里定义同样一个结构体,结构体里定义了array[0..255] of char。  
先用allocmem给结构体分配空间,然后调用dll里的函数,但是返回的结构体里的字符数组全都是#0,这是怎么回事啊?  
我要把得到的结构体里的字符数组转化成string型,该怎么做?  type CT_TCPROW = record
  dwState : DWORD;
  szLocalAddr : array[0..255] of Char;
  dwLocalPort : DWORD;
  szRemoteAddr : array[0..255] of Char;
  dwRemotePort : DWORD;
  dwProcessId : DWORD;
  ImagePath : array[0..255] of Char;
  FileMd5 : array[0..32] of Char;
 end; CT_TCPSTATE = record
  dwNumEntries : DWORD;
  table : array of CT_TCPROW;
 end;
 PCT_TCPSTATE = ^CT_TCPSTATE;
 TTCPstate = array[0..12] of string;
var
  Form1 : TForm1;
  TCP_len : Integer;
  P_TCP : Pointer;
  P_ct_tcpstate : PCT_TCPSTATE;  SLocalAddr, SRemoteAddr, SState, SProcessID, SImagePath, SMd5, SAdd : string;
  TCPState : TTCPState;implementationuses
  Unit2;{$R *.dfm}procedure TCPQueryBufferLength(len : Pinteger);stdcall;
  external 'CTNetHelp.dll' name 'TCPQueryBufferLength';
procedure UDPQueryBufferLength(len : Pinteger);stdcall;
  external 'CTNetHelp.dll' name 'UDPQueryBufferLength';
procedure CTGetTcpState(len : PCT_TCPSTATE);stdcall;
  external 'CTNetHelp.dll' name 'CTGetTcpState';
procedure CTGetUdpState(len : PCT_UDPSTATE);stdcall;
  external 'CTNetHelp.dll' name 'CTGetUdpState';
procedure TForm1.PageControl1Change(Sender: TObject);
var
  I : integer;
begin
  case PageControl1.ActivePageIndex of
    0:
begin
        ListView1.Clear;        TCPState[0] := '???';
        TCPState[1] := 'CLOSED';
        TCPState[2] := 'LISTENING';
        TCPState[3] := 'SYN_SENT';
        TCPState[4] := 'SYN_RCVD';
        TCPState[5] := 'ESTABLISHED';
        TCPState[6] := 'FIN_WAIT1';
        TCPState[7] := 'FIN_WAIT2';
        TCPState[8] :='CLOSE_WAIT';
        TCPState[9] := 'CLOSING';
        TCPState[10] := 'LAST_ACK';
        TCPState[11] := 'TIME_WAIT';
        TCPState[12] := 'DELETE_TCB';     TCPQueryBufferLength( @TCP_len );
      P_ct_tcpstate := PCT_TCPSTATE(AllocMem( TCP_len ));      CTGetTcpState( P_ct_tcpstate );
        for I := 0 to P_ct_tcpstate.dwNumEntries-1 do
        begin
          if P_ct_tcpstate.table[i].szLocalAddr = nil then
            Break;
          if P_ct_tcpstate.table[i].szRemoteAddr = nil then
            Break;
          if P_ct_tcpstate.table[i].ImagePath = nil then
            Break;          SAdd := ':';
          SLocalAddr := PChar( @P_ct_tcpstate.table[i].szLocalAddr ) ;
          SLocalAddr := SLocalAddr + inttostr( P_ct_tcpstate.table[i].dwLocalPort );
          SRemoteAddr := PChar( @P_ct_tcpstate.table[i].szRemoteAddr ) ;
          SRemoteAddr := SRemoteAddr + inttostr( P_ct_tcpstate.table[i].dwRemotePort);
          SState := TCPState[P_ct_tcpstate.table[i].dwState];
          SProcessID := inttostr( P_ct_tcpstate.table[i].dwProcessId );
          SImagePath := PChar( @P_ct_tcpstate.table[i].ImagePath );
          SMd5 := PChar( @P_ct_tcpstate.table[i].FileMd5 );
          with ListView1.Items.Add do
            begin
              Caption := 'TCP';
              SubItems.Add( SLocalAddr );
              SubItems.Add( SRemoteAddr );
              SubItems.Add( SState );
              SubItems.Add( SProcessID );
              SubItems.Add( SImagePath );
              SubItems.Add( SMd5 );
            end;
        end;
        FreeMem( P_ct_tcpstate );
   end;    end;
end;
这是dll的simplevoid main()
{
printf("=====================================================\n");
printf("\tConTrail网络帮助模块演示程序!\n\tOne part of WildFire!\n");
printf("=====================================================\n");
printf("\n\n\n\n\n"); HMODULE hMod = LoadLibrary("CTNetHelp.dll"); PTCPQueryBufferLength TCPQueryBufferLength = NULL;
PCTGetTcpState CTGetTcpState = NULL; TCPQueryBufferLength = (PTCPQueryBufferLength)GetProcAddress(hMod,"TCPQueryBufferLength");
CTGetTcpState = (PCTGetTcpState)GetProcAddress(hMod,"CTGetTcpState"); int Len = 0; TCPQueryBufferLength(&Len);
printf("TCP Len:%d\n",Len); char *p = NULL; p = (char *)malloc(Len);
memset(p,0,Len);
PCT_TCPSTATE ct_tcpstate = (PCT_TCPSTATE)p;
CTGetTcpState(ct_tcpstate);

printf("TCP NumEntries:%d\n",ct_tcpstate->dwNumEntries);
for ( DWORD i = 0; i < ct_tcpstate->dwNumEntries; i++ )
{
printf("=====================================================\n");
printf("LocalAddr:%s\n",ct_tcpstate->table[i].szLocalAddr);
printf("LocalPort:%d\n",ct_tcpstate->table[i].dwLocalPort);
printf("RemoteAddr:%s\n",ct_tcpstate->table[i].szRemoteAddr);
printf("RemotePort:%d\n",ct_tcpstate->table[i].dwRemotePort);
printf("PID:%d\n",ct_tcpstate->table[i].dwProcessId);
printf("ImagePath:%s\n",ct_tcpstate->table[i].ImagePath);
printf("MD5:%s\n",ct_tcpstate->table[i].FileMd5);
printf("\n\n");
printf("=====================================================\n");
}
free(p);
getchar();
}