2008-09-27 3 views
3

Я разрабатываю клиент TCP/IP, который должен иметь дело с собственным двоичным протоколом. Я рассматривал использование пользовательских типов для представления заголовков протоколов и использование CopyMemory для перетасовки данных в и из UDT и массива байтов. Однако, похоже, что VB6 добавляет байты заполнения для выравнивания пользовательских типов. Есть ли способ заставить VB6 не заполнять UDT, аналогично директиве #pragma, доступной во многих компиляторах C/C++? Может быть, специальный коммутатор перешел к компилятору?Имеет ли VB6 эквивалент пакета #pragma?

+1

Возможно, немного поздно, но вы можете создать определение библиотеки типов UDT, которое задает размер минимального байта, и добавить это как ссылку. Я использовал редактор библиотеки типов, который поставляется с помощью «Advanced Visual Basic 6 Power Techniques for Everyday Programs» Мэтью Курленда. – 2011-10-29 00:02:53

+0

@Mark: Это довольно опрятное решение. Всегда удивительно, сколько вы можете сделать с «обработанными вручную» TLB-файлами и VB6. – 2011-10-29 02:44:56

ответ

4

No.

Лучше писать код низкого уровня в C или C++ (где у вас есть #pragma пакет), а затем выставить интерфейс через COM.

(Из любопытства, почему вы до сих пор работаете с VB6 вместо VB.NET?)

1

Существует не способ заставить VB6, чтобы не набивать UDT, подобная директиву #pragma пакета доступны во многом C/C++, но вы можете сделать это наоборот.

В соответствии с Q194609 Visual Basic использует выравнивание по 4 байтам и Visual C++ по умолчанию использует 8 байтов.

При использовании VB6 для вызова в DLL C, я использовал файлы заголовков 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" 
Смежные вопросы