2008-09-27 129 views
3

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

+1

现在可能有点迟了,但是您可以创建一个指定最小字节大小的UDT的类型库定义,并将其添加为参考。我使用了由Matthew Curland提供的“适用于日常程序的高级Visual Basic 6 Power Techniques”的类型库编辑器。 – 2011-10-29 00:02:53

+0

@Mark:无论如何,这都是一个非常好的解决方案。用“手工制作”的TLB文件和VB6可以做多少总是令人惊讶。 – 2011-10-29 02:44:56

回答

4

最好的办法是写在C或C低级代码++(其中你有#pragma包),然后通过COM公开接口。

(出于好奇,你为什么还用VB6,而不是VB.NET工作?)

1

没有任何办法强迫VB6不垫UDT的,类似的#pragma pack指令可以在许多C/C++编译器,但你可以用相反的方法来完成。

根据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"