Probleme de marshalisation

BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 - 13 janv. 2009 à 09:33
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 - 13 janv. 2009 à 17:48
Bonjour, j'ai parcouru le Forum et n'ai rien trouvé qui fonctionne.J'essaye d'acceder a une DLL non managé et j'ai cette erreur :

<<Le
type n'a pas pu être marshalé, car la longueur d'une instance de
tableau incorporée ne correspond pas à la longueur déclarée dans la
disposition.>>

EN VB6 :
Declare Function Lance Lib "USBLib" (ByVal hHandle As Integer,  ByRef pTransfer As
DATA_ACQUISITION) As Integer

Public Type DATA_ACQUISITION
  Calibrage As Byte
  Voie(3) As ACQUISITION_VOIE
  Config As ACQUISITION_CONFIG
  Trig As ACQUISITION_TRIG
End Type

EN VB.NET :

Declare Function Lance Lib "USBLib" (ByVal hHandle As Integer,
<MarshalAsAttribute(UnmanagedType.Struct)> ByRef pTransfer As
DATA_ACQUISITION) As Integer

  <StructLayout(LayoutKind.Sequential)> Public Structure DATA_ACQUISITION
    Dim Calibrage As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> Dim Voie() As ACQUISITION_VOIE
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)> Dim Config As ACQUISITION_CONFIG
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=7)> Dim Trig As ACQUISITION_TRIG
    '----------------------------------------------------------
    Public Sub Initialize()
      ReDim Voie(3)
    End Sub
  End Structure

Dans
les structure en VB6 j'ai des byte et des long que j'ai transformé en
byte et integer pour VB.NET. Visiblement ce serait la declaratation de
tableau de structure (--Voie()--) qui poserai problème. Enfin je crois.

Je pensais avoir compris "en partie" la marshalisation mais alors là je suis perdu ... Si vous avez une idée

MisterMok

8 réponses

BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
13 janv. 2009 à 09:44
    '<MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> Dim Voie() As ACQUISITION_VOIE
    Dim Actif1 As Byte
    Dim Calibre1 As Byte
    Dim Differentiel1 As Byte
    Dim Actif2 As Byte
    Dim Calibre2 As Byte
    Dim Differentiel2 As Byte
    Dim Actif3 As Byte
    Dim Calibre3 As Byte
    Dim Differentiel3 As Byte
    Dim Actif4 As Byte
    Dim Calibre4 As Byte
    Dim Differentiel4 As Byte

    <MarshalAs(UnmanagedType.Struct, SizeConst:=6)> Dim Config As ACQUISITION_CONFIG
    <MarshalAs(UnmanagedType.Struct, SizeConst:=7)> Dim Trig As ACQUISITION_TRIG

A noter que si je casse le tableau de structure Voie en le decomposant, là ca fonctionne. Une piste peut-etre ?

MisterMok
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 janv. 2009 à 10:09
Pour les autres variables, tu déclare des integer en VB6, il te faut donc déclarer des Short en VB.Net.

Integer (VB6) ---> Short (.Net)
Long (VB6) ---> Integer (.Net)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
13 janv. 2009 à 10:18
En fait je n'ai pas d'integer en VB6  ... que des byte et des long ....

en VB6  pour les deux autres strucures :

  Public Type ACQUISITION_TRIG
    Dim TrigOn As Byte
    Dim PreTrigOn As Byte
    Dim FrontMontant As Byte
    Dim Valeur As long
  End Type
  Public Type ACQUISITION_CONFIG
    Dim BaseDeTemps As Byte
    Dim Reload As Byte
    Dim UnsurN As long
  End Type

en VB.NET

  Structure ACQUISITION_TRIG

    Dim TrigOn As Byte

    Dim PreTrigOn As Byte

    Dim FrontMontant As Byte

    Dim Valeur As Integer

  End Structure

  Structure ACQUISITION_CONFIG

    Dim BaseDeTemps As Byte

    Dim Reload As Byte

    Dim UnsurN As Integer

  End Structure

MisterMok
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 janv. 2009 à 13:13
EN VB6 :
Declare Function Lance Lib "USBLib" (ByVal hHandle As Integer,  ByRef pTransfer As DATA_ACQUISITION) As Integer

à déclarer en Short en .Net

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 janv. 2009 à 13:21
Je trouve d'ailleurs étrange un Handle de type Integer en VB6.

Elle vient d'où cette dll ? ya moyen de trouver de la doc sur le net.

Au vue des fonctions et structures indiquées, elle n'a rien à voir avec la dll UsbLib.dll qui sert à configurer un port usb. Il semblerait plutot que ce soit une dll propriétaire pour dialoguer avec un appareil de mesure.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
13 janv. 2009 à 15:43
c'est effectivement une DLL propriétaire que j'ai faite il y a quelques temps en VC++.
Erreur de ma part après relecture pour le VB6 : Declare Function Lance Lib "GTIcommX" (ByVal hHandle As long,  ByRef pTransfer As DATA_ACQUISITION) As long
(probleme de copier/coller et du stress)

J'ai poussé un peu plus loin mes tests et j'arrive correctement a dialoguer avec elle en mettant des variables directement sans passer par tableau. C'est vraiment ce problème de déclaration du tableau Voie() qui pose problème. Je n'arrive pas a marshaliser afin que la structure complete ait la bonne taille (enfin je suppose). Si tu as une idée.

Merci de ton investissement

MisterMok
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 janv. 2009 à 16:53
là, je ne vois pas, à part le fait que ton tableau est déclaré sans dimension dans la structure

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
13 janv. 2009 à 17:48
Oui j'ai eu le même souci, mais avec sharpdevelop (comme avec VB2005 - j'ai fait le test pour verifier) il me donne une erreur me disant : "les tableaux déclarés en tant que membre de structure ne peuvent pas pas etre déclarés avec une taille initiale".

ce qui fait que dans ma structure j'ai essayé de faire ceci :

  <StructLayout(LayoutKind.Sequential)> Public Structure DATA_ACQUISITION
    Dim Calibrage As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> Dim Voie() As ACQUISITION_VOIE  'SizeConst = 3 x 4
   <MarshalAs(UnmanagedType.Struct, SizeConst:=6)> Dim Config As ACQUISITION_CONFIG
    <MarshalAs(UnmanagedType.Struct, SizeConst:=7)> Dim Trig As ACQUISITION_TRIG
    '----------------------------------------------------------
    Public Sub Initialize()
      ReDim Voie(3)
    End Sub
  End Structure

J'y accede parfaitement en tant qu'utilisation normale (mémoire managée) mais quand je dois la marshaliser pour l'exporter vers ma DLL, ca coince. Par contre comme dit plus haut le fait de ne pas declarer de tableau et d'organiser mes variable avec des bytes simples ca fonctionne (coherence dans l'espace mémoire).

Cela viens donc bien de cette declaration. Surement que je n'ai pas assimilé toutes les options du mode Marshal et là j'ai bien besoin de plus grand que moi ... ca doit pas etre bien difficile lol vu mes maigres competence d'informaticien

MisterMok
0