begin process at 2012 02 12 04:00:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Windows

 > 

API

 > 

Probleme de marshalisation


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de marshalisation

mardi 13 janvier 2009 à 09:33:48 | Probleme de marshalisation

BarthOlivier

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
mardi 13 janvier 2009 à 09:44:37 | Re : Probleme de marshalisation

BarthOlivier

'<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
mardi 13 janvier 2009 à 10:09:16 | Re : Probleme de marshalisation

casy

Membre Club
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) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
mardi 13 janvier 2009 à 10:18:03 | Re : Probleme de marshalisation

BarthOlivier

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
mardi 13 janvier 2009 à 13:13:34 | Re : Probleme de marshalisation

casy

Membre Club
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) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
mardi 13 janvier 2009 à 13:21:37 | Re : Probleme de marshalisation

casy

Membre Club
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) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
mardi 13 janvier 2009 à 15:43:57 | Re : Probleme de marshalisation

BarthOlivier

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
mardi 13 janvier 2009 à 16:53:41 | Re : Probleme de marshalisation

casy

Membre Club
là, je ne vois pas, à part le fait que ton tableau est déclaré sans dimension dans la structure


---- Sevyc64  (alias Casy) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
mardi 13 janvier 2009 à 17:48:23 | Re : Probleme de marshalisation

BarthOlivier

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


Cette discussion est classée dans : data, byte, integer, acquisition, voie


Répondre à ce message

Sujets en rapport avec ce message

pointeurs sous vb . help [ par Pistounade ] Au secours !! qui peux m'aider , je tente de faire appel à la fonction readData ( ecrite ci- dessous) , mais ca plante a chaque fois , moi et les poin Taille maximum d'un tableau de byte ? [ par cretthie ] Bonjour,Comme indiqué dans le titre, j'aimerai bien savoir si la taille d'un tableau de byte est limité. Si oui,a quelle taille. D'apres moi, comme on Cast de Variant en Integer [ par Rockanos ] Bonjour Voici mon problème : J'ai une fonction qui reçois des données venant de Winsock (c'est du detail)... Dans ce cas c'est un nombre qui est env problème avec GetMACAddress [ par Ce.plusplus ] Bonjour, j'ai un petit problème avec un code très courant qui permet de donnner l'adresse MAC d'une machine... Cela aurai pu ne pas être gênant, mais Envoyer une image par winsock [ par hippo92210b ] Bonjour, Voila, je travaille sur une application de partage d'image, mais je bloque au niveaux du transfert (par winsock), voila mon code : FROM1 : lpt data acquisition [ par etudeselectroniques ] Par défaut, les datas du port parallèle sont en sortie.Comment sous win2000/XP, les reconfigurer en entrée ?Normalement, le bit 5 de @base+2 ($37A) le Gestion d'un tableau de Bytes [ par cuzco38 ] Bonjour,Je n'arrive pas à gérer corectement des données binérairesexplication:Via un socket winsock je fais un download ftp d'un fichier binaire volum VBA : Obtention adresse MAC : Probleme d allocation Memoire [ par bankrout ] Bonjour a tous,Je désire creer une macro VBA qui me permettera de recuperer l adresse mac du PC, afin de securiser l utilisation du classeur.Comme tou Integer to Bytes() [ par yvesyves ] Bonjour,Je cherche une fonction simple permettant de convertir un entier non signé UShort ou UInt16 sous un tableau de bytes Byte. Je sais que celui-c ???? conversion d'un string vers Byte, Integer ou short [ par JeremyNeReculeraPas ] Salut salut à  tous!!!J'ai un pti problème que je n'arrive pas à résoudre et qui me rapel bien que je ne suis qu'un débutant...lolJ'essaye de faire un


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,229 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales