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
Toutes les valeurs collent sauf :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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+
Partager