4

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

4

2 回答 2

5

不。

最好的办法是用 C 或 C++(你有的地方#pragma pack)编写低级代码,然后通过 COM 公开接口。

于 2008-09-27T05:20:22.807 回答
1

没有任何方法可以强制 VB6 不填充 UDT,类似于许多 C/C++ 编译器中可用的 #pragma pack 指令,但您可以反过来做。

根据 Q194609,Visual Basic 使用 4 字节对齐,Visual C++ 默认使用 8 字节。

当使用 VB6 调用 C DLL 时,我使用 MS “pshpack4.h” 头文件来处理对齐,因为各种编译器以不同的方式执行此操作,如下所示(经过编辑的)示例:

// 这是在一个名为 vbstruct.h 的头文件中
...

# 定义 VBSTRING 字符
# 定义 VBFIXEDSTRING 字符
# 定义 VBDATE 双精度
# 定义 VBSINGLE 浮点数

# ifdef _WIN32
# 定义 VBLONG 长
# 定义 VBINT 短
# else // 这是针对 16 位代码而不是 64 位的!!!!
# 定义 VBLONG 长
# 定义 VBINT 整数
# 万一
...

# 包括“pshpack4.h”
...

typedef struct VbComputerNameStruct
    {
    VBLONG 名称;
    VBSTRING 计算机名[VB_COMPUTERNAME_LENGTH];
    } VbComputerNameType;


typedef struct VbNetwareLoginInfoStruct
    {
    VBLONG 对象标识符;
    VBINT 对象类型;
    VBSTRING 对象名[48];
    } VbNetwareLoginInfoType;
...

# 包括“poppack.h”
于 2008-09-27T05:37:41.127 回答