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"