Pergunta

Estou desenvolvendo um cliente TCP / IP que tem de lidar com um protocolo binário proprietário. Eu estava a considerar o uso de tipos definidos pelo utilizador para representar os cabeçalhos de protocolo, e usando CopyMemory para baralhar de dados de e para o UDT e uma matriz de bytes. No entanto, parece que VB6 adiciona bytes de preenchimento para tipos definidos pelo usuário Alinhar. Existe alguma maneira de forçar VB6 para não pad UDT de, semelhante à directiva #pragma pack disponível em muitos compiladores C / C ++? Talvez um interruptor especial passados ??para o compilador?

Foi útil?

Solução

No.

Sua melhor aposta é para escrever o código de baixo nível em C ou C ++ (onde você tem #pragma pack), em seguida, expor a interface via COM.

Outras dicas

Não há qualquer maneira de forçar VB6 para não pad UDT de, semelhante à directiva #pragma pack disponível em muitos / C compiladores C ++, mas você pode fazê-lo o contrário.

De acordo com Q194609 Visual Basic usa 4 bytes alinhamento e Visual C ++ usa 8 bytes por padrão.

Ao utilizar VB6 para chamar a um DLL C, I utilizado o MS "pshpack4.h" ficheiros de cabeçalho para lidar com o alinhamento porque vários compiladores fazer isso de diferentes maneiras, como mostrado neste exemplo (em vez editada):

// 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"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top