我正在开发一个必须处理专有二进制协议的TCP / IP客户端。我正在考虑使用用户定义的类型来表示协议头,并使用CopyMemory将数据与UDT和字节数组进行混洗。但是,似乎VB6添加了填充字节以对齐用户定义的类型。有没有办法强制VB6不填充UDT,类似于许多C / C ++编译器中提供的#pragma pack
指令?也许是一个传递给编译器的特殊开关?
答案 0 :(得分:5)
没有。
最好的办法是用C或C ++编写低级代码(你有#pragma pack
),然后通过COM公开接口。
答案 1 :(得分:1)
没有任何方法可以强制VB6不填充UDT,类似于许多C / C ++编译器中提供的#pragma pack指令,但你可以反过来这样做。
根据Q194609,Visual Basic使用4个字节对齐和 Visual C ++默认使用8个字节。
当使用VB6调用C DLL时,我使用MS“pshpack4.h”头文件来处理对齐,因为各种编译器以不同的方式执行此操作,如此(相当编辑)示例所示:
// this is in a header file called vbstruct.h ... # define VBSTRING char # define VBFIXEDSTRING char # define VBDATE double # define VBSINGLE float # ifdef _WIN32 # define VBLONG long # define VBINT short # else // and this was for 16bit code not 64bit!!!! # define VBLONG long # define VBINT int # endif ... # include "pshpack4.h" ... typedef struct VbComputerNameStruct { VBLONG sName; VBSTRING ComputerName[VB_COMPUTERNAME_LENGTH]; } VbComputerNameType; typedef struct VbNetwareLoginInfoStruct { VBLONG ObjectId; VBINT ObjectType; VBSTRING ObjectName[48]; } VbNetwareLoginInfoType; ... # include "poppack.h"