Есть ли в VB6 эквивалент #pragma pack? - PullRequest
4 голосов
/ 27 сентября 2008

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

Ответы [ 2 ]

5 голосов
/ 27 сентября 2008

Нет.

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

1 голос
/ 27 сентября 2008

Нет никакого способа заставить 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...