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?
Répondre
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?)
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 ;-) –
Utilisation en conjonction avec les conseils donnés ci-dessous – computinglife
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"
- 1. équivalent de Directory.CreateDirectory() dans VB6
- 2. Est-ce que ArrayObject de PHP a un équivalent in_array?
- 3. Est-ce que Python a un équivalent à 'switch'?
- 4. est-ce que cdb/windbg a un équivalent à autoexp.dat?
- 5. Que signifie "Shift: =" dans ce code VB6?
- 6. équivalent de WeekDay Fonction de VB6 en C#
- 7. Est-ce que PHP a un équivalent à ce type de substitution de chaîne Python?
- 8. Est-ce que SQL Server 2005 a un équivalent au type de données ENUM de MySql?
- 9. VB6 équivalent pour le type de données flottant SQL 2K?
- 10. Est-ce que jQuery a un équivalent à Element.identify de Prototype?
- 11. Est-ce que C# a un équivalent à encodeURIComponent() de JavaScript?
- 12. Est-ce que java a un équivalent à la clause C# "using"
- 13. Xcode - Utilisation de la marque #pragma
- 14. C++ pragma GCC directive system_header
- 15. Linq équivalent à SQL LIKE [a-f]
- 16. pack bits Int16 dans un Ushort VB.net
- 17. Est-ce que Ruby a un built-in do ... while?
- 18. PRAGMA journal_mode = OFF ne fonctionne pas pourquoi?
- 19. Pack Notation dans WPF
- 20. A « _ » chaque fois que j'utiliser un <a href Code
- 21. PHP a-t-il un équivalent à la syntaxe de compréhension de liste de Python?
- 22. Est-ce que Silverlight a un VirtualizingStackPanel?
- 23. Equivalent (fonctionnalité) d'ObjPtr de VB6 en C#?
- 24. Passage de tableaux en tant que paramètres dans VB6
- 25. Oracle a-t-il un équivalent des variables de table de SQL Server?
- 26. Y a-t-il un équivalent de `date_default_timezone_set()` de PHP qui fonctionne dans MySQL?
- 27. VB6 MSOUTL.OLB Envoyer un courrier
- 28. Equivalent du pack de Swing en C#
- 29. Y a-t-il un équivalent à ContextLoader du ressort pour un non-webapp?
- 30. format d'entrée de fichier du pack Git
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. –
@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. –