IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Mémoire protégée sur un 2ème OpenFileDialog


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut Mémoire protégée sur un 2ème OpenFileDialog
    Hello !

    Bon, je poste car je deviens fou...

    J'utilise un OpenFileDialog pour aller chercher un fichier, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim FileName As String
    ...
    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
         FileName = OpenFileDialog1.FileName
         ...
    A la première utilisation, aucun problème.
    Mais si je réutilise l'OpenFile (sans quitter le prog), ça plante lamentablement sur une
    Tentative de lecture écriture en mémoire protégée....
    Je me suis dit qu'il fallait vider tout ça avant de réutiliser la fonction mais je n'y parviens pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    OpenFileDialog1.Dispose
    OpenFileDialog1.Reset
    Rien ne marche...

    Et ça ne vient pas du fichier car l'erreur apparaît immédiatement après avoir cliqué sur le bouton appelant le OpenFile.

    Je précise que je suis sur MS VB 2008 Express sous W7 (mais ça faisait pareil sous XP...).

    Si quelqu'un a une idée, moi je suis sec...

    Merci bcp !!!

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Une solution simple de contournement est qu'au lieu d'utiliser un openfiledialog déposé en tant que composant sur ta form, tu crées un nouveau openfiledialog par code à chaque appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim openDialog as new OpenFileDialog
    ' les options
    if openDialog.ShowDialog() = ...

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    Merci de ta réponse, mais cela fait pareil...
    C'est fou, le premier coup fonctionne, pas le 2ème.
    J'ai pourtant bien ajouté ta ligne et supprimé le OpenFileDialog sur le Designer.

    J'avais essayé beaucoup de déclarations et il m'avait semblé que c'était le ShowDialog qui posait problème...

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Pas possible fait voir ton code complet !

  5. #5
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    Je suis désolé, il est énorme, c'est pas que je veux pas le mettre mais je veux pas trop t'embêter non plus... pour l'instant juste la fonction, sachant qu'il se passe pas grand chose avant...

    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
    20
    21
    22
    23
    24
    25
     
    Private Sub But_Pil_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Pil.Click
     
            Results.Dispose()
     
            Dim FileName As String
            Dim Extension As String
     
            Cal_SGI = True
     
            'Idem avec ou sans (et objet dans le Designer)
            Dim OpenFileDialog1 As New OpenFileDialog
     
            If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                FileName = OpenFileDialog1.FileName
                Extension = New System.IO.FileInfo(FileName).Extension
                If Extension <> ".sgi" And Extension <> ".rgb" Then
                    MsgBox("It's not a sgi image file!")
                    Ecrire_Fichier_Log("It's not a SGI/RGB image file!")
                    Exit Sub
                Else            
                    Results.Show()
                End If
            End If
        End Sub

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    En isolant la fontion dans un projet simple je n'arrive pas à reproduire, je ne vois pourtant pas ce qui peut perturber un OpenFileDialog, dans Results, qui est affiché à la fin et qui, a priori le perturbe, il n'y a que des affichage divers et pas de réutilisation de OpenFileDialog...

    Je continue à étoffer jusqu'à ce que je reproduise le problème...

    Merci

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Tu fais un Result.Dispose et plus loin un Result.Show, ce qui peut expliquer ton souci. Une fois Dispose appelé, il est risqué/déconseillé d'appeler des méthodes sur cet objet.

    Result représente quel type d'objet ? Ta current Form ? Une autre Form ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    salut,
    j'ai eus le même problème que toi. Pour ma part ça fonctionnait très bien sur windows XP et 1 fois sur 2 sur seven . J'ai fais les 2 méthodes ( par code et designer ). J'ai remarquais qu'il y avaient des mises à jours du .NET client profile et depuis que je les ai fait, je n'ai plus aucun problème...

    EDIT : J'ai remarqué aussi que la version 2 d'openfiledialog fonctionne très bien alors que la 4 pose problème..

  9. #9
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    Hello,

    Arnard, en fait j'ai désactivé l'appel (et le Dispose) et ça plante, un peu moins mais bon, ça ne résout pas. J'ai l'impression que moins il y a de traitement, moins ça plante mais qu'en fait ce n'est pas lié aux traitements en eux même (qui ne sont "que" du traitement d'image).

    champomy62, merci, je vais essayer de mettre à jour.
    Par contre, tu parles d'une version 2 et d'une 4 d'openfiledialog, est-ce en relation avec la màj .NET, peut-on choisir entre les deux ?

    Merci à tous !

  10. #10
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    champomy62, j'ai la version .NET Framework Client Profile 4.0.30319 du 6 octobre 2010, et toujours le problème...

    J'Edit mon post :
    Non en fait il n'est pas présent dans les références du projet, c'est toujours le 2, par contre, il y a des dizaines de dll dans le dossier du 4, la ou lesquelles faut-il ajouter ?

    PS : désolé mais j'en reviens à la version du openfiledialog, tu dis que la 2 fonctionne mieux mais alors pourquoi installer la .NET 4... comprends po

  11. #11
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    Je précise, et j'ai d'autres questions, dans les références de mon projet, je pointe sur :
    C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Build.Framework.dll

    J'ai également un dossier Framework64... à utiliser à la place ?
    Si je passe dessus, mon soft ne tourneras que sur du 64 bits ?

  12. #12
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    J'ai trouvé ce qui fait planté le OpenFileDialog.

    C'est cette ligne, juste après le OpenFileDialog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TestFileSGI(FileName, SizeX, SizeY, Planes, Bit, InfoPtr) Then
    La fonction pointe vers une Dll qui renvoie des infos de l'image, c'est le pointeur InfoPtr, qui contient le header qui ne lui plait pas...

    Voici la déclaration juste au dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim InfoPtr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Info(80)))
    Et l'utilisation juste après la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Info(80) As Char
    Info = CType(Marshal.PtrToStringAnsi(InfoPtr, 80), Char())
    Ce qui est bizarre c'est que le soft marche une fois et plante à la seconde... enfin je pense que je dois mal utiliser la mémoire...
    Et en plus, il ne plante pas sur cette ligne mais sur le OpenFileDialog...

    Par contre, quand je commente l'appel, ça marche à tous les coups.

    J'ai essayé de vider mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Marshal.FreeHGlobal(InfoPtr)

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    Bah en tout cas sois patient parce que moi en tout cas il s'est résolue tout seul le problème ... ^^

    Non je penses pas que tes lignes de code après influent quoi que ce soit... Ca tient plus du composant en lui même je pense..(dites moi si j'ai tord). Sinon j'avais pensé à utilisé un composant tiers libre..

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    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
    20
    21
    Dim OfdImporter As New OpenFileDialog
     
    OfdImporter.Filter = "Fichiers texte *.txt|*.txt"
            OfdImporter.Title = " Importer "
     
     
           With OfdImporter
     
                .FilterIndex = 1
                .RestoreDirectory = True
                .CheckFileExists = True
                .CheckPathExists = True
                .ValidateNames = True
     
                If (.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
     
                     ' ton traitement
     
                End if
     
           End with

  15. #15
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    Super, merci !

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    ça fonctionne ?

    EDIT : ta plus de bug ?

  17. #17
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 28
    Par défaut
    Ben en fait j'avais déjà plus de bug, j'ai modifié mon appel à la DLL pour ne plus gérer un Marshall Alloc. Mais sinon ta solution doit marcher également.

    Par contre pourquoi avant ça marchait un coup sur deux... probablement pour les raisons que tu as indiqués.

    Merci beaucoup en tous cas !

  18. #18
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonsoir,

    Étant donné que la classe OpenFileDialog implémente l'interface IDisposable il pourrait être "judicieux" (pour ne pas dire indispensable) de l'utiliser dans une clause Using afin que les ressources qu'il accapare soient bien libérées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Using ofd As New OpenFileDialog
        '...
    End Using
    Cordialement !

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    Ok c'est vrai que c'est intéressant. Par exemple avec ma solution si je fais un dispose(), est-ce correct aussi ?

  20. #20
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Citation Envoyé par champomy62 Voir le message
    Ok c'est vrai que c'est intéressant. Par exemple avec ma solution si je fais un dispose(), est-ce correct aussi ?
    Tu peux, même s'il est facile d'oublier; par contre il faut être sûr de passer par lui c'est à dire utiliser une construction dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim ofd As OpenFileDialog
    Try
        ofd = New OpenFileDialog
        ' ...
    Catch ex As Exception
        ' Gestion des exceptions (optionnelle)
    Finally
        If Not ofd Is Nothing Then ofd.Dispose()
    End Try
    Cordialement !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tentative de R/W de mémoire protégée
    Par BenjaminLustrement dans le forum C++/CLI
    Réponses: 3
    Dernier message: 29/06/2006, 12h18
  2. "Mémoire insuffisante" sur Win98
    Par slimjoe dans le forum Delphi
    Réponses: 14
    Dernier message: 22/06/2006, 20h47
  3. Mémoire installée sur pc distant
    Par systeme1 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 30/11/2005, 14h04
  4. [Gestion mémoire] SetLength sur TDoubleDynArray
    Par MD Software dans le forum Langage
    Réponses: 14
    Dernier message: 24/04/2005, 22h11
  5. Manque de mémoire virtuelle sur Win2000 pro
    Par annedjomo dans le forum Windows Serveur
    Réponses: 7
    Dernier message: 02/03/2005, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo