2008-09-27 132 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"