这个vc结构体是这样的:
typedef struct
{
    void *content;
    unsigned char flags;
    unsigned char vsm_size;
    unsigned char vsm_data [ZMQ_MAX_VSM_SIZE];
} zmq_msg_t;其中,ZMQ_MAX_VSM_SIZE=30,请教这个结构体用Delphi封装出来时怎样的?对象名称不变哈

解决方案 »

  1.   

    TMQMsg = record
      Content: Pointer;
      Vsm_Size: Char;
      Vsm_Data: array[0..ZMQ_MAX_VSM_SIZE - 1] of Char;
    end;
    参考
      

  2.   


    const
      ZMQ_MAX_VSM_SIZE = 30; 
    type
    zmq_msg_t = record
       content:Pointer;
       flags:Byte;
       vsm_size:Byte;
       vsm_data:array[0..ZMQ_MAX_VSM_SIZE] of Byte;
    end;
      

  3.   

    +++我写的有点小问题,应该是
    vsm_data:array[0..ZMQ_MAX_VSM_SIZE-1] of Byte;
      

  4.   

    能够把数组变成指针吗?
    比如这样:
    type
    zmq_msg_t = record
       content:Pointer;
       flags:Byte;
       vsm_size:Byte;
       vsm_data:pchar;
    end;
      

  5.   

    不要变成指针,这样结构体的长度就不对了如果你程序里要用到结构体数组,还要注意字节对齐的问题。c++的结构体是4字节对齐,delphi默认是8的
      

  6.   

    字节对齐是什么意思呢?
    我在Delphi中掉要VC生成的动态链接库,其中动态链接库有函数的参数就是这个结构体的指针。
    我的封装是这样的:type
    zmq_msg_t = record
       content:Pointer;
       flags:Byte;
       vsm_size:Byte;
       vsm_data:array[0..29] of Byte;
    end;
    zmq_msg_tp=^zmq_msg_t;动态链接库中的函数原型是:
    int zmq_msg_init (zmq_msg_t *msg);
    我在Delphi中是这样定义的:
    function zmq_msg_init(msg:zmq_msg_tp):Integer;cdecl;
    请教这样有问题没?
      

  7.   

    这个里面其实就是四个问题:
    1 C中的unsigned char对应delphi里面的Byte
    2 无类型指针
    3 静态数组就是确定一个长度,C的结构体是默认对其的,转换成Delphi的记录,不用加packed
    4 C的参数默认调用规则是cdecl,这跟Delphi默认的不一致,一定要写清楚。
    因此,你这样写是没有问题的。
      

  8.   

    zmq_msg_t *msg写成 var msg: zmq_msg_t就可以了。
      

  9.   

    对其不对齐关系到内存的摆放、存储、寻址。最明显的就是用SizeOf测试对齐、不对齐的大小就明白了。