2008-09-27 4 views
3

Je développe un client TCP/IP qui doit faire face à un protocole binaire propriétaire. J'envisageais d'utiliser des types définis par l'utilisateur pour représenter les en-têtes de protocole, et d'utiliser CopyMemory pour mélanger des données vers et depuis l'UDT et un tableau d'octets. Cependant, il semble que VB6 ajoute des octets de remplissage pour aligner les types définis par l'utilisateur. Y at-il un moyen de forcer VB6 à ne pas pad UDT, similaire à la directive #pragma pack disponible dans de nombreux compilateurs C/C++? Peut-être un commutateur spécial passé au compilateur?Est-ce que VB6 a un équivalent de #pragma pack?

+1

Probablement un peu en retard maintenant, mais vous pouvez créer une définition de bibliothèque de types d'un UDT qui spécifie la taille minimale des octets et l'ajouter comme référence. J'ai utilisé l'éditeur de bibliothèque de types qui est livré avec "Advanced Visual Basic 6 Power Techniques for Everyday Programs" par Matthew Curland. –

+0

@Mark: Quelle que soit la solution. Il est toujours surprenant de voir tout ce que vous pouvez faire avec les fichiers TLB "hand-crafted" et VB6. –

Répondre

4

No.

Votre meilleur pari est d'écrire le code de bas niveau en C ou C++ (où vous avez paquet #pragma), puis exposer l'interface via COM.

(Par curiosité, pourquoi travaillez-vous toujours avec VB6 au lieu de VB.NET?)

+0

C'est une application héritée écrite en VB6 et il y a longtemps, il a été décidé qu'il était préférable de garder autant de VB6 que possible plutôt que de mélanger et d'assortir .NET et COM. Probablement un peu idéaliste de notre part, mais là encore COM Interop n'est pas toujours le plus amusant à travailler ;-) –

+0

Utilisation en conjonction avec les conseils donnés ci-dessous – computinglife

1

Il n'y a aucun moyen de forcer VB6 à ne pas UDT pad de, semblable à la directive #pragma pack disponible dans de nombreux Compilateurs C/C++, mais vous pouvez le faire dans l'autre sens.

Selon Q194609 Visual Basic utilise l'alignement 4 octets et Visual C++ utilise 8 octets par défaut. Lors de l'utilisation de VB6 pour appeler une DLL C, j'ai utilisé les fichiers d'en-tête MS "pshpack4.h" pour gérer l'alignement car différents compilateurs le font de différentes façons, comme illustré dans cet exemple (plutôt édité):

 
// 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" 
Questions connexes