BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 2012
-
13 janv. 2009 à 09:33
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 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
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 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 ?
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 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.
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 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