课程设计做个系统,我用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();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货