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

Langage Delphi Discussion :

Problème de DLL : plantage depuis découpage de code


Sujet :

Langage Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Points : 208
    Points
    208
    Par défaut Problème de DLL : plantage depuis découpage de code
    Bonjour

    J'ai un problème bizarre avec une dll (voir ici) que j'utilise

    Je fais un programme pour afficher le contenu d'un fichier compressé. J'ai un menu Charger, lorsque je clique dessus je décompresse mon fichier grace à une fonction contenue dans une DLL.

    Code du menu Charger:
    Code Delphi : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    procedure TfrmPrincipal.cmdChargerClick(Sender: TObject);
    var
      extensionSelection : string;
      fichierSelectionne : Tmemorystream;
      fichierDecomp : Tmemorystream;
      tailleFinale : LongWord;
    begin
    	//si fichier choisi
    	if choixFichier.Execute then
      begin
      	//récupère son extension
      	extensionSelection := ExtractFileExt(choixFichier.Files[0]);
     
        try
    	    //crée une zone en mémoire
    	    fichierSelectionne := TMemoryStream.Create;
    	    fichierSelectionne.LoadFromFile(choixFichier.Files[0]);
     
    	    if extensionSelection = '.cdat' then
    	    begin
          	        //décompresse
          	        fichierDecomp:= TMemoryStream.Create;
     
             	//récupère taille finale
            	tailleFinale := decompress_size(fichierSelectionne.Memory);
     
    	        //assigne la taille au futur fichier décompressé
            	fichierDecomp.Size := tailleFinale;
     
            	//décompresse le fichier compressé
            	tailleFinale := decompress(fichierSelectionne.Memory,fichierDecomp.Memory);
     
    	    end;
        finally
        	if Assigned(fichierSelectionne) = true then
          begin
    		    fichierSelectionne.Free;
          end;
     
          if Assigned(fichierDecomp) = true then
          begin
    		    fichierDecomp.Free;
          end;
        end;
      end;
    end;

    Jusque la ça fonctionne J'ai essayé de découper mon code pour que le bout de code qui décompresse, soit dans une autre procédure:

    Code Delphi : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    procedure TfrmPrincipal.cmdChargerClick(Sender: TObject);
    var
      extensionSelection : string;
      fichierSelectionne : Tmemorystream;
      fichierDecomp : Tmemorystream;
    begin
    	//si fichier choisi
    	if choixFichier.Execute then
      begin
      	//récupère son extension
      	extensionSelection := ExtractFileExt(choixFichier.Files[0]);
     
        try
    	    //crée une zone en mémoire
    	    fichierSelectionne := TMemoryStream.Create;
    	    fichierSelectionne.LoadFromFile(choixFichier.Files[0]);
     
    	    if extensionSelection = '.cdat' then
    	    begin
          	        //décompresse
          	        fichierDecomp:= TMemoryStream.Create;
                    decompresserFichier(fichierSelectionne,fichierDecomp);
    	    end;
        finally
        	if Assigned(fichierSelectionne) = true then
          begin
    		    fichierSelectionne.Free;
          end;
     
          if Assigned(fichierDecomp) = true then
          begin
    		    fichierDecomp.Free;
          end;
        end;
      end;
    end;

    La fonction decompresserFichier() :
    Code Delphi : 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
     
    procedure TfrmPrincipal.decompresserFichier(var fichierLecture : Tmemorystream; var fichierEcriture: Tmemorystream);
    var
    	tailleFinale : LongWord;
     
    begin
    	//récupère taille finale
    	tailleFinale := decompress_size(fichierLecture.Memory);
     
    	//assigne la taille au futur fichier décompressé
    	fichierEcriture.Size := tailleFinale;
     
    	//décompresse le fichier compressé
    	tailleFinale := decompress(fichierLecture.Memory,fichierEcriture.Memory);
     
    end;
    Problème : l'appel fonctionne mais au moment de sortir de cette dernière fonction decompresserFichier(), delphi me génère une erreur "Access Violation ............."

    Et j'ai cette erreur uniquement si je découpe mon code.

    Si vous avez une idée de pourquoi ça plante, j'en serai plus que ravie. Ca fait plusieurs jours que je suis la dessus et je commence à désésperer

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Alors, on commence par le simple avant d'aller plus loin

    les directives var dans decompresserFichier ne sont pas utiles, lorsque tu modifie le Size cela modifie l'objet, ou même memory cela ne modifie que le contenu de l'objet, le var n'est utile que si tu avais voulu ré-instancier l'objet (changer le pointeur de l'objet, ... en delphi, un objet c'est avant tout un pointeur)

    ces deux écrire fonctionnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Assigned(fichierSelectionne) = true then
    if Assigned(fichierSelectionne) then // plus simple non, les booléens c'est fait pour ça !
    Passé cela, je ne vois pas, à quel ligne cela provoque-t-il l'exception ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Points : 208
    Points
    208
    Par défaut
    Merci. Je savais pas pour les var, je voulais éviter que ça copie inutilement mon objet.

    En mode debug, ça plante sur le de ma procédure de décompression donc au moment ou il sort de la procédure.

    Si j'affiche un message avec Showmessage() après avoir décompressé, le message est bien affiché et ça plante après.

    Si je sauvegarde avec fichierEcriture.saveToFile(), mon fichier est bien sauvegardé et conforme à ce que je t'attends. Mais la procédure plantera une fois qu'elle sera terminée.

Discussions similaires

  1. Appel d'une dll C depuis du code Python
    Par gnayoke dans le forum Général Python
    Réponses: 7
    Dernier message: 18/02/2010, 14h26
  2. problème appel dll c++ non managée depuis C#
    Par zwazillon dans le forum C#
    Réponses: 2
    Dernier message: 19/10/2009, 15h10
  3. Réponses: 2
    Dernier message: 26/06/2007, 17h46
  4. Réponses: 2
    Dernier message: 19/12/2006, 15h51
  5. Problème de DLL.
    Par Lunedor dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/11/2003, 10h17

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