VB6是否具有等效的#pragma包?
时间:2020-03-06 14:49:08 来源:igfitidea点击:
我正在开发必须处理专有二进制协议的TCP / IP客户端。我正在考虑使用用户定义的类型来表示协议标头,并考虑使用CopyMemory来将数据从UDT和字节数组移入和移出。但是,VB6似乎添加了填充字节以对齐用户定义的类型。有什么方法可以迫使VB6不填充UDT,类似于许多C / C ++编译器中可用的#pragma pack指令?也许是传递给编译器的特殊开关?
解决方案
不。
最好的选择是用C或者C ++(在其中确实有#pragma`包)编写低级代码,然后通过COM公开接口。
(出于好奇,我们为什么仍在使用VB6而不是VB.NET?)
与许多C / C ++编译器中可用的#pragma pack指令类似,没有任何方法可以强制VB6不填充UDT。
根据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"