我正在开发一个必须处理专有二进制协议的 TCP/IP 客户端。我正在考虑使用用户定义的类型来表示协议标头,并使用 CopyMemory 将数据与 UDT 和字节数组进行混洗。但是,VB6 似乎添加了填充字节来对齐用户定义的类型。有什么方法可以强制 VB6 不填充 UDT,类似于#pragma pack
许多 C/C++ 编译器中可用的指令?也许是传递给编译器的特殊开关?
Mike Spross
问问题
2076 次
2 回答
5
不。
最好的办法是用 C 或 C++(你有的地方#pragma pack
)编写低级代码,然后通过 COM 公开接口。
于 2008-09-27T05:20:22.807 回答
1
没有任何方法可以强制 VB6 不填充 UDT,类似于许多 C/C++ 编译器中可用的 #pragma pack 指令,但您可以反过来做。
根据 Q194609,Visual Basic 使用 4 字节对齐,Visual C++ 默认使用 8 字节。
当使用 VB6 调用 C DLL 时,我使用 MS “pshpack4.h” 头文件来处理对齐,因为各种编译器以不同的方式执行此操作,如下所示(经过编辑的)示例:
// 这是在一个名为 vbstruct.h 的头文件中 ... # 定义 VBSTRING 字符 # 定义 VBFIXEDSTRING 字符 # 定义 VBDATE 双精度 # 定义 VBSINGLE 浮点数 # ifdef _WIN32 # 定义 VBLONG 长 # 定义 VBINT 短 # else // 这是针对 16 位代码而不是 64 位的!!!! # 定义 VBLONG 长 # 定义 VBINT 整数 # 万一 ... # 包括“pshpack4.h” ... typedef struct VbComputerNameStruct { VBLONG 名称; VBSTRING 计算机名[VB_COMPUTERNAME_LENGTH]; } VbComputerNameType; typedef struct VbNetwareLoginInfoStruct { VBLONG 对象标识符; VBINT 对象类型; VBSTRING 对象名[48]; } VbNetwareLoginInfoType; ... # 包括“poppack.h”
于 2008-09-27T05:37:41.127 回答