Does VB6 tem um pacote #pragma equivalentes?
-
02-07-2019 - |
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?
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"