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 : 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
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+