none
Relire un fichier binaire sauvegardé en VB6 avec VB.Net RRS feed

  • Question

  • Bonjour,

    Je rencontre un problème pour lire un Type (une structure en VB.net) sauvegardé en binaire avec VB6.

    L'instruction FileGet(NF, Structure) renvoie l'erreur suivante "Les dimensions du tableau ne correspondent pas à celles spécifiées par l'attribut VBFixedArray ".

    Cette structure contenait des tableaux. Les tableaux étaient sauvegardés avec Lbound = 1 et VB.net impose 0.

    Existe t'il une solution?

     

    jeudi 15 décembre 2011 14:03

Réponses

  • Dim Ys(0 To NomStrucEnt.Npt - 1) As Double

    FileGet(NF, Ys)

    On peut lire le tableau avec cette déclaration et Option Strict Off

    Comment faire pour lire avec option strict ON ?

    Je n'arrive pas à déclarer en disant que le type est Array et qu'il contient NomStrucEnt.Npt  éléments de double.

    samedi 17 décembre 2011 14:00
  • Ca fonctionne avec Option strict ON.

    Dim Ys As Array = New Double(0 To NomStrucEnt.Npt - 1) {}

    FileGet(NF, Ys)

    samedi 17 décembre 2011 14:15
  • Je voudrais rajouter une chose.

    La solution proposée fonctionne pour les tableaux fixes sauvegardés avec VB6.

    Si les tableaux sont des tableaux dynamiques sauvegardés avec VB6, vous allez avoir un entête égal à 2 octets + 8*la dimension.

    Exemple :

    Public type Toto(en VB6)

    EnteteTOTO as string

    Tab1() as double

    Tab2() as double

    Tab3() as double

    End type

    Si la dimension des tableaux est 1 il faudra faire un seek de seek +10 avant de lire le premier tableau, pareil pour le second et le 3ème.

    Si dans la structure Tab2 est vide (dimension 0), il faudra faire un seek de seek +2 pour lire Tab3.

    Il faut prédimensionner les tableaux avant de faire le FileGet. L'entête du type lu dans un premier temps (EnteteTOTO), me permet de le faire.

    L'entête avant le tableau permet peut être aussi de récupérer la longueur du tableau pour le prédimensionnement (c'est à chercher).

    Cordialement.


    lundi 19 décembre 2011 09:16

Toutes les réponses

  • Bonjour,

    Je dirais que si le tableau est déclaré avec le même nombre d'éléments cela devrait coller ? Donc Dim t(1 to 6) en vb deviendrait un VBFixedArray(5) en VB.NET ?

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 15 décembre 2011 16:09
    Modérateur
  • J'ai un peu avancé.

    J'ai créé une autre structure qui permet de lire l'entête (tout sauf les tableaux). Ca fonctionne.

    Il reste à lire les tableaux. Je peux les dimensionner avec VBfixedArray, vu que la taille est maintenant connue.

    vendredi 16 décembre 2011 09:01
  • FileOpen(NF, NFich, OpenMode.Binary, OpenAccess.Default, OpenShare.Default, -1)

    FileGet(NF, InstNomStrucEnt)

    NomStrucEnt = CType(InstNomStrucEnt, NomStrucEnt)

    lgt = Seek(NF)'Pour connaitre la position en débogage

    Dim Ys(0 To NomStrucEnt.Npt - 1) As Double

    FileGet(NF, CType(Ys, System.Array))

    La lecture de l'entête du fichier dans NomStrucEnt est correcte.

    Pour le tableau, il n'a pas d'erreurs mais Ys reste rempli de 0, c'est un tableau de double dimensionné de 1 à Npt en VB6.0.

    Si quelqu'un connait la solution je suis preneur.

    Il faut lire un tableau de double dont le dimensionnement avant lecture est donné par l'entête. Le fichier est sauvé avec VB6.0.


    • Modifié MarcelD22 vendredi 16 décembre 2011 13:05
    vendredi 16 décembre 2011 13:02
  • Dim Ys(0 To NomStrucEnt.Npt - 1) As Double

    FileGet(NF, Ys)

    On peut lire le tableau avec cette déclaration et Option Strict Off

    Comment faire pour lire avec option strict ON ?

    Je n'arrive pas à déclarer en disant que le type est Array et qu'il contient NomStrucEnt.Npt  éléments de double.

    samedi 17 décembre 2011 14:00
  • Ca fonctionne avec Option strict ON.

    Dim Ys As Array = New Double(0 To NomStrucEnt.Npt - 1) {}

    FileGet(NF, Ys)

    samedi 17 décembre 2011 14:15
  • Bonjour, Marcel,

     

    Est-ce qu’on peut considérer votre problème résolu et clôturer ce thread ? De toute façon, merci pour avoir partagé avec nous le code.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 19 décembre 2011 08:51
  • Je voudrais rajouter une chose.

    La solution proposée fonctionne pour les tableaux fixes sauvegardés avec VB6.

    Si les tableaux sont des tableaux dynamiques sauvegardés avec VB6, vous allez avoir un entête égal à 2 octets + 8*la dimension.

    Exemple :

    Public type Toto(en VB6)

    EnteteTOTO as string

    Tab1() as double

    Tab2() as double

    Tab3() as double

    End type

    Si la dimension des tableaux est 1 il faudra faire un seek de seek +10 avant de lire le premier tableau, pareil pour le second et le 3ème.

    Si dans la structure Tab2 est vide (dimension 0), il faudra faire un seek de seek +2 pour lire Tab3.

    Il faut prédimensionner les tableaux avant de faire le FileGet. L'entête du type lu dans un premier temps (EnteteTOTO), me permet de le faire.

    L'entête avant le tableau permet peut être aussi de récupérer la longueur du tableau pour le prédimensionnement (c'est à chercher).

    Cordialement.


    lundi 19 décembre 2011 09:16