VB6是否具有#pragma包等效物?

VB6是否具有#pragma包等效物?,vb6,Vb6,我正在开发一个TCP/IP客户端,它必须处理一个专有的二进制协议。我正在考虑使用用户定义的类型来表示协议头,并使用CopyMemory来洗牌UDT和字节数组之间的数据。但是,VB6似乎添加了填充字节来对齐用户定义的类型。是否有任何方法可以强制VB6不填充UDT,类似于许多C/C++编译器中可用的#pragma pack指令?可能是传递给编译器的特殊开关?否 你最好写C或C++中的低级代码(你有< C++ > PrimaMARPACT/),然后通过COM.< /P> < P>接口,没有任何方式可以

我正在开发一个TCP/IP客户端,它必须处理一个专有的二进制协议。我正在考虑使用用户定义的类型来表示协议头,并使用CopyMemory来洗牌UDT和字节数组之间的数据。但是,VB6似乎添加了填充字节来对齐用户定义的类型。是否有任何方法可以强制VB6不填充UDT,类似于许多C/C++编译器中可用的
#pragma pack
指令?可能是传递给编译器的特殊开关?


<>你最好写C或C++中的低级代码(你有< C++ > PrimaMARPACT/<代码>),然后通过COM.< /P> < P>接口,没有任何方式可以强制VB6不去填充UDT,类似于许多C/C++编译器中的“Apple PrimaMulk包”指令,但是你可以反过来做。 根据Q194609,Visual Basic使用4字节对齐和 默认情况下,Visual C++使用8字节。 当使用VB6调用C DLL时,我使用MS“pshpack4.h”头文件来处理对齐,因为不同的编译器以不同的方式执行此操作,如以下(经过编辑的)示例所示:

//这在名为vbstruct.h的头文件中 ... #定义VBSTRING字符 #定义VBFIXEDSTRING字符 #定义VBDATE双精度 #定义单个浮点数 #ifdef_WIN32 #定义VBLONG long #定义VBINT short #else//这是16位代码,不是64位!!!! #定义VBLONG long #定义VBINT #恩迪夫 ... #包括“pshpack4.h” ... typedef结构VbComputerNameStruct { vblongsname; VBSTRING ComputerName[VB_ComputerName_LENGTH]; }vb计算机名称类型; 类型定义结构VBNetWareLoginFostruct { VBLONG-ObjectId; VBINT对象类型; VBSTRING对象名[48]; }VBNetwareLoginFoType; ... #包括“poppack.h”
现在可能有点晚了,但是您可以创建UDT的类型库定义来指定最小字节大小,并将其添加为引用。我使用了Matthew Curland的“高级Visual Basic 6 Power技术用于日常程序”附带的类型库编辑器。@Mark:不管怎样,这是一个非常简洁的解决方案。使用“手工制作”的TLB文件和VB6可以做多少事情总是令人惊讶。 // 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"