VB6有#pragma包等价吗?

时间:2008-09-27 05:02:53

标签: vb6

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

2 个答案:

答案 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"