在一个c的DLL库里面定义了一个结构,调用函数时需要使用到这个结构:
typedef struct _USERDEVICEINFO
{
char szname[17];
BYTE mac[6]; 
char szIP[16];  
USHORT uPort;   
char szMask[16]; 
char szGate[16]; 
char szRemoteIP[16];
USHORT uRemotePort; 
         BYTE  NetMode; }USERDEVICEINFO,*PUSERDEVICEINFO;函数定义:BOOL __stdcall EzCfg_GetNodeConfig (char* szIpAddr,PUSERDEVICEINFO pUserDevInfo);我再delphi里面定义了同样的结构:
type PUSERDEVICEINFO = record
    szname: array[0..16] of Char; 
    mac: array[0..5] of byte; 
    szIP: array[0..15] of Char;
    uPort: word; 
    szMask: array[0..15] of Char; 
    szGate: array[0..15] of Char; 
    szRemoteIP: array[0..15] of Char; 
    uRemotePort: word; 
    NetMode: byte; 
  end;puserInf :PUSERDEVICEINFO ;EzCfg_GetNodeConfig(pansichar(edtIP.Text), puserInf);静态调用dll, 可是返回的有些数据总是不对,有的字符串少了开头一个字符,有的正确,这是为什么?
这样调用对吗?谢谢各位!

解决方案 »

  1.   

    第1~3个是对的  uport以后的就都不对了
      

  2.   

    typedef struct _USERDEVICEINFO
    {
    char szname[17];
    BYTE mac[6];
    char szIP[16];
    USHORT uPort;
    char szMask[16];
    char szGate[16];
    char szRemoteIP[16];
    USHORT uRemotePort;
    BYTE NetMode;}USERDEVICEINFO,*PUSERDEVICEINFO;这个 PUSERDEVICEINFO 是指针类型的啊..puserInf :PUSERDEVICEINFO ;EzCfg_GetNodeConfig(pansichar(edtIP.Text), puserInf);你传的好像不一致吧.
      

  3.   

    have a try
    type USERDEVICEINFO = record
        szname: array[0..16] of Char; 
        mac: array[0..5] of byte; 
        szIP: array[0..15] of Char;
        uPort: word; 
        szMask: array[0..15] of Char; 
        szGate: array[0..15] of Char; 
        szRemoteIP: array[0..15] of Char; 
        uRemotePort: word; 
        NetMode: byte; 
      end;type PUSERDEVICEINFO = ^USERDEVICEINFO;puserInf :PUSERDEVICEINFO ;
      

  4.   

    type PUSERDEVICEINFO = packed record
        szname: array[0..16] of Char; 
        mac: array[0..5] of byte; 
        szIP: array[0..15] of Char;
        uPort: word; 
        szMask: array[0..15] of Char; 
        szGate: array[0..15] of Char; 
        szRemoteIP: array[0..15] of Char; 
        uRemotePort: word; 
        NetMode: byte; 
      end;puserInf :PUSERDEVICEINFO 
    向上面这样定义就行了!
      

  5.   

    谢谢,可以了  为什么要加一个  packed  呢
      

  6.   

    对齐问题。如果不设,就可能会以四个字节对齐,即uport可能是对齐到能被四整除的地址上,而它的前面会填充看不见的字节。
      

  7.   

    其实这个问题不能一概而论的:)
    关键是要双方协议好,楼主的错误在于不知道那个VC写的程序定义结构时采用的是1字节对齐。
    但是也不能只要碰到VC的结构就认为是一字节对齐呀,如果它采用缺省的设置(8字节对齐),那么你加了packed反而还错了。我再多说两句,呵呵。
    Delphi里面record的对齐方式可以在project->options->compiler里面设置record field alignment,默认是8字节对齐。
    如果你在里面设置为1字节对齐,那么这个地方你不加packed一样OK。
    至于packed record它会忽略这个设置选项,由它定义的结构都采用1字节对齐。所以你在这个地方加packed是碰巧对的!!!
    如果VC里面并不是设置的1字节对齐而是2、4字节对齐,你就完蛋了这个问题虽然看起来不起眼,但是很重要哦,特别是网络编程的时候,Delphi写的程序和VC写的程序进行通讯尤其要注意。如果想测试设置是否成功,可以用sizeof看看效果。
      

  8.   

    网络编程按理说应该都是1字节对齐,这样不会产生混乱。Delphi中可以用 {$A1}, {$A2}, {$A4}, {$A8} 来定义1、2、4、8对齐。
      

  9.   

    多谢阿贵,我以前只知道VC里面可以用预处理命令来设置对齐:
    #pragma pack(push, 1)
    #pragma pack(pop)今天又学了一招:)