求助vb6结构体在内存中占字节的说明Private Type POINT
    x As Long
    y As Long
End TypePrivate Type DROPFILES
    pFiles As Long
    pt As POINT
    fNC As Long
    fWide As Long
End Type
如上结构。我知道在vb6中string 是以 btsr类型存在的。那么上面结构实例化后,在内存中是怎么排列的呢,有没有4个字节的引导字节呢?
请前辈指点我,最好是以图示的形式

解决方案 »

  1.   

    API 中不是 BSTR
    http://www.vckbase.com/document/viewdoc/?id=444
      

  2.   

    这种是按照成员所占空间,按顺序直接分配内存的。
    用什么图啊,代码最能说明问题:
    Option ExplicitPrivate Type POINT
      x As Long
      y As Long
    End TypePrivate Type DROPFILES
      pFiles As Long
      pt As POINT
      fNC As Long
      fWide As Long
    End TypePrivate Sub Form_Click()
       Dim stcTest As DROPFILES   Cls
       Print Hex$(VarPtr(stcTest))
       Print Hex$(VarPtr(stcTest.pFiles))
       Print Hex$(VarPtr(stcTest.pt))
       Print Hex$(VarPtr(stcTest.pt.x))
       Print Hex$(VarPtr(stcTest.pt.y))
       Print Hex$(VarPtr(stcTest.fNC))
       Print Hex$(VarPtr(stcTest.fWide))
    End Sub
      

  3.   

    Private Type DROPFILES
      pFiles As Long
      pt As POINT
      fNC As Long
      fWide As Long
    End Type你自己试一下就知道了:
    sub comand1_clikc
    dim x as DROPFILESdebug.print varptr(x.pFiles),Varptr(x.pt),varptr(x.fnc),Varptr(fWidth)
    end sub
      

  4.   

    //CCU_485msg.h  CCU_TIMER_VALUE y1
    #ifndef __CCU_485MSG_H__#define __CCU_485MSG_H__.. "CCU_typedef.h"
    #define MAX_QUEUE_MSG_LEN       (256) /* 队列消息最大长度, 不能随意修改 */
    #define BROADCAST_TIMES         (400) /* 发送广播次数 */
    typedef enum {y1_25MS  = (1),              /* 25ms定时器值 */
    y1_50MS  = (1 * 2),          /* 50ms定时器值 */
    y1_100MS = (2 * 2),    y1_200MS = (4 * 2),   y1_500MS = (10 * 2),         
    y1_1S    = (20 * 2),   y1_2S    = (40 * 2),  y1_3S    = (60 * 2),         
    y1_5S    = (100 * 2),  y1_10S   = (200 * 2), y1_15S   = (300 * 2),        
    y1_30S   = (600 * 2),  y1_1M    = (1200 * 2), y1_3M    = (3000 * 2),       
    y1_4M    = (4000 * 2),  y1_5M    = (5000 * 2), y1_10M   = (10000 * 2),
    y1_15M   = (15000 * 2), y1_1H    = (71999 * 2)       }y1_ENUM;
    /* 消息类型定义 */typedef enum {
    CCU_485_MSG_TYPE,       CCU_TIMER_MSG_TYPE,  
    CCU_API_MSG_TYPE,   CCU_485INTERNAL_TYPE, /*3 485内部命令 */ 
    CCU_LOOP_MSG_TYPE,  /*4 485串口环回消息 */ CCU_DT_MSG_TYPE  /*5 透传消息类型 */
    }CCU_MSG_TYPE;
    /* 命令字定义 */
    typedef enum {CCU_CARD_REG_CMD,   /* 子卡注册命令 */
     CCU_BOTTOM_CMD = 0xFF                     /* 底板命令 */
     }CCU_CMD_TYPE;
    /* 定时器类消息类型枚举 */
    typedef enum {
        TIMER_CMD_ADDR_QUERY,                     /* 地址轮询消息 */
        TIMER_CMD_ADDR_AUTO_ALLOT,                /* 地址自动分配消息 */
        TIMER_CMD_LINK_KEEP,                      /* 485链路维护消息 */
        TIMER_CMD_BROADCAST,                      /* 广播消息 */
        TIMER_CMD_TYPE_UNKONWN                    /* 非法消息 */
    }CCU_TIMER_MSG_ENUM;
    /* 各类型消息定时触发控制基数, 可控 */
      

  5.   


    typedef struct{
        UINT32 ulAddrQueryMsgRad;                /* 地址轮询基数 */
        UINT32 ulAddrAutoAllotMsgRad;            /* 地址自动分配基数 */
        UINT32 ulLinkKeepMsgRad;                 /* 链路维护基数 */
        UINT32 ulDtMsgCntsMsgRad;                /* 透传消息基数 */
    }CCU_MSG_RAD, *PCCU_MSG_RAD;
    /* 通用消息队列消息结构 */
    typedef struct tag_MSG_BUF{ long int  mType;    /* 消息类型 */
    char      mText[MAX_QUEUE_MSG_LEN]; }CCU_QUEUE_MSG, *PCCU_QUEUE_MSG;
    /* 消息帧结构 */
    typedef struct tag_CCU_MSGFRAME{ UINT32  ulMsgPid;   /* PID */
    UINT32  ulResId; /* 资源ID用来查找不同节点 */
    UINT16  uwSeq;   /* 上层传下来的序列号 */UINT8   ucDir;    /* 消息方向 */
    UINT8   ucHostType;  /* 主机类型 */  UCHAR   ucNetFn; /* 命令大类api类和timer类 */             
    UCHAR   ucCmd;   /* 各类的命令字 */    
        UINT16  uwLen;                           /* 数据域长度 */
        UCHAR   aucData[MAX_485_DATA_LEN];       /* 数据域 */
    }CCU_MSG_FRAME, *PCCU_MSG_FRAME;
    /* 时间间隔基数 */extern CCU_MSG_RAD      g_stMsgRad;
    /* API消息结构体 */extern CCU_QUEUE_MSG    g_stApiSendMsg[MAX_CCU_CHAN_NUM];
    /* 透传消息结构 */extern CCU_QUEUE_MSG    g_stDtRecvMsg[MAX_CCU_CHAN_NUM];
    /* 透传消息结构 */extern CCU_QUEUE_MSG    g_stDTSendMsg[MAX_CCU_CHAN_NUM];
    extern VOID SendManger100msMsg(VOID);
    extern VOID SendManger500msMsg(VOID);
    extern VOID SendManger1sMsg(VOID);
    extern VOID SendManger5sMsg(VOID);
    extern VOID SendManger1hMsg(VOID);
    extern VOID InitMsgTimeRad(VOID);
    extern VOID Proc485Msg(PCCU_MSG_FRAME pMsg);
    extern VOID ProcTimerMsg(PCCU_MSG_FRAME pMsg);
    extern VOID SendTimerMsg(UINT32 ulMsgType);
    extern VOID SetAddrAllotMsgRad(y1_ENUM enTimer);
    extern VOID SetAddrQueryMsgRad(y1_ENUM enTimer);
    extern VOID SetLinkKeepMsgRad(y1_ENUM enTimer);
    extern VOID TimerMsgGenerator(UINT32 ulTimerCount);#endif 
      

  6.   

    Option ExplicitPrivate Type POINT
      x As Long
      y As Long
    End TypePrivate Type DROPFILES
      pFiles As Long
      pt As POINT
      fNC As Long
      fWide As Long
    End TypePrivate Sub Command1_Click()
        Dim stcTest As DROPFILES
        Debug.Print LenB(stcTest) '结果是20个字节
    End Sub