StructLayout(LayoutKind.Sequential) affectation d'une classe
Bonjour,
Je suis en train de wrapper une dll sous VB.Net et j'ai quelques soucis.
Je passe une classe avec la mention
StructLayout(LayoutKind.Sequential) , l'ensemble de mes propriétés sont remplies, mais deux propriétés consécutives sont erronées.
Pour me contrôler j'utilise un de mes programmes VB6 où la structure (à la place de la classe) est récupérée par un copymemory depuis le pointeur que me renvoie la dll vers la structure.(ce programme marche très bien et depuis longtemps).
J'ai paramétré mes propriétés comme indiquées dans la doc C de la dll, en utilisant short, Ushort, integer pour faire correspondre les types C à des types VB.Net.
Voici mon code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <StructLayout(LayoutKind.Sequential)> Public Class GFL_BITMAP
Public Type As Short
Public Origin As Short
Public Width As Integer
Public Height As Integer
Public BytesPerLine As UInteger
Public LinePadding As UShort
Public BitsPerComponent As UShort
Public ComponentsPerPixel As UShort
Public BytesPerPixel As UShort
Public Xdpi As UShort
Public Ydpi As UShort
Public TransparentIndex As Short
Public ColorUsed As Integer
Public ColorMap As Integer
Public Data As Integer
Public Comment As Integer
Public MetaData As Integer
End Class |
Toutes les valeurs collent sauf :
Public BytesPerLine As UInteger où j'obtiens 1328 à la place de 1300
Public LinePadding As UShort où j'obtiens 64 à la place de 4
Cette dernière ligne me fait réagir car 64 ce n'est jamais que 4 décalé de 4 bits.
Partant de ce constat j'ai tenté d'utiliser
StructLayout(LayoutKind.Explicit)
Mais à ma grande surprise les offsets ne sont pas à calculer dans l'odre où apparaissent mes propriétés. En effet après height je trouve les valeurs de Xdpi et Ydpi.
Mes questions sont donc :
D'où peut provenir l'erreur en utilisant layout.sequential, ou plus précisément comment fonctionne exactement le procédé (avec le nom des propriétés, un calcul d(offset mais là ...), car comment expliquer que deux valeurs consécutives soient fausses, mais les valeurs suivantes sont justes ??
(nota j'ai essayer de changer le type en BYTE, SByte rien n'y fait)
Quel est le fonctionnement de explicit, et comment ce fait-il que l'ordre des propriétés ne correspond pas à celui du sequential.
Existe-il un moyen de récupérer un tableau d'octets à la place des propriétés pour essayer de traduire ? (NB: en passant une variable intptr byval à la place de la classe en ByRef je récupère un GFL_BIMAP** )
J'espère avoir été clair ...
A+