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

 Delphi Discussion :

violation d'accès à l'adresse xx


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut violation d'accès à l'adresse xx
    bonjour;

    j'ai un programme qui crée un fichier dans le répertoire temporaire de windows, premièrement je récupère le path du dossier temporaire avec "GetTempPath",
    ensuite je crée un fichier dedans "tous se passe bien jusque ici".

    quand j'essaye d'écrire dans le fichier créé, un message d'erreur s'affiche

    <violation d'accès à l'adresse xxxxxx dans le module {nom du fichier}, lecture de l'adresse 00000000>

    je crois que c'est du aux droits d'accès mais je sais pas quoi faire.

    merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Montres-nous un bout de code.
    Car si tu arrives à créer le fichier, il y a de fortes chances que tu puisses le modifier.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    j'ai essayé dans d'autres emplacement et ça marche bien, mais pas avec le dossier temporaire.
    voici un bout du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
          FillChar(pathTMP,sizeof(pathTMP),0);
          GetTempPath(sizeof(pathTMP),pathTMP);
          FDest   :=pathTMP+ChangeFileExt(ExtractFileName(ParamStr(0)),'.exe');
          DestFileStream := TFileStream.Create(FDest,fmCreate);
          DeCompresse(Methode,ResourceStream,DestFileStream,RecSFX);//c'est là où plante le programme 
        finally
          ResourceStream.Free;
          DestFileStream.Free;
        end;

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Le programme que tu exécutes EST stocké dans le répertoire temporaire et tu essayes de l'écraser

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Le programme que tu exécutes EST stocké dans le répertoire temporaire et tu essayes de l'écraser
    j'ai pas bien compris, parce que si je remplace le path du répertoire temporaire avec un autre, sa marche

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try
          {FillChar(pathTMP,sizeof(pathTMP),0);
          GetTempPath(sizeof(pathTMP),pathTMP);
          FDest  :=pathTMP+ChangeFileExt(ExtractFileName(ParamStr(0)),'.exe');}
          FDest:='D:/'+ExtractFileName(ParamStr(0));
          DestFileStream := TFileStream.Create(FDest,fmCreate);
          DeCompresse(Methode,ResourceStream,DestFileStream,RecSFX);
        finally
          ResourceStream.Free;
          DestFileStream.Free;
        end;

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    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 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Je crois que Andnotor souligne que tu tentes de modifier le Fichier EXE qui est en cours d'execution !
    Normalement un executable lancé ne peut pas être modifié !

    Des sujets connexes :
    Mise a jour d'une application par elle-même.
    Un Programme Delete Lui Meme
    l'application de s'auto-supprimer après sa fermeture

    Autre Suggetions : lancer un exe depuis un TMemoryStream

    Surement il y a une erreur dans cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDest   :=pathTMP+ChangeFileExt(ExtractFileName(ParamStr(0)),'.exe');
    pourrait devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDest   :=pathTMP+ChangeFileExt(ExtractFileName(ParamStr(0)),'.data');
    GetTempPath fourni bien quelque chose ?
    GetTempPath fourni normalement un chemin, un IncludeTrailingPathDelimiter pour s'en assurer à la limite
    Vérifie que le retour GetTempPath soit supérieur à zéro !

    ParamStr(0) est surement déjà un .exe
    ChangeFileExt de .exe à .exe ne sert pas à grand chose !

    Sinon Application.ExeName c'est plus lisible que ParamStr(0)
    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

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je crois que Andnotor souligne que tu tentes de modifier le Fichier EXE qui est en cours d'execution !
    Normalement un executable lancé ne peut pas être modifié !
    mais ce que je veut n'est pas de modifier l'exe qui est en cours d'exécution!

    je donne plus d'explication:
    enfaîte l'exe qui est en cours d'exécution contient un fichier compressé, et ce que je veut c'est qu'au moment de l'exécution,
    le fichier compressé doit s'extraire dans le répertoire temporaire pour ensuite le lancé.

    j'ai essayer avec d'autre répertoire et sa marche.

    Citation Envoyé par ShaiLeTroll Voir le message
    Surement il y a une erreur dans cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDest   :=pathTMP+ChangeFileExt(ExtractFileName(ParamStr(0)),'.exe');
    pourrait devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDest   :=pathTMP+ChangeFileExt(ExtractFileName(ParamStr(0)),'.data');
    GetTempPath fourni bien quelque chose ?
    GetTempPath fourni normalement un chemin, un IncludeTrailingPathDelimiter pour s'en assurer à la limite
    Vérifie que le retour GetTempPath soit supérieur à zéro !
    le fichier de sortie est un exécutable.
    j'ai fait ShowMessage(FDest); pour voir si ça donne le bon chemin {c'est le bon}

    Citation Envoyé par ShaiLeTroll Voir le message
    ParamStr(0) est surement déjà un .exe
    ChangeFileExt de .exe à .exe ne sert pas à grand chose !

    Sinon Application.ExeName c'est plus lisible que ParamStr(0)
    Application.ExeName donne tous le chemin du fichier, alors je ne peut pas l'utiliser.

    sinon j'ai changer vers FDest :=pathTMP+ExtractFileName(ParamStr(0));et le problème reste le même!

    merci pour vos aides

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    as-tu essayé de tester si FileExists(DestStream) ? Et dans ce cas, un DeleteFile avant de créer le Stream (même si je pense que le fmCreate doit l'effacer)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    as-tu essayé de tester si FileExists(DestStream) ? Et dans ce cas, un DeleteFile avant de créer le Stream (même si je pense que le fmCreate doit l'effacer)
    le résultat de mon programme c'est qu'il crée le fichier mais je ne peut pas le modifier.

    j'ai testé avec FileExists(FDest), ça m'indique que le fichier n'existe pas malgré
    qu'en regardant dans le répertoire temporaire de windows je trouve le fichier (0 octet).

    j'ai testé FileExists sur d'autres fichier de ce répertoire mais ça donne le même résultat.

  10. #10
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Le problème doit venir de la méthode DeCompresse. Si à la place de Decompresse tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       DestFileStream.Write(pathTMP[0],Length(pathTMP));
    Est-ce que cela fonctionne?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       DestFileStream.Write(pathTMP[0],Length(pathTMP));
    Est-ce que cela fonctionne?
    Oui ça fonctionne bien

    j'ai pas douter de la procedure DeCompress parce qu'elle fonctionne quand j'utilise
    d'autres répertoire comme destination.

    mais je voie pas l'erreur dans la procedure

    voici le code de la procedure DeCompress

    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
    procedure DeCompresse(Methode:TMethodeCompression;Source,Destination:TStream;t:TRecSFX);
    var     DStream: TDecompressionStream;
            taille:int64;
    begin
            case Methode of
            mcNone: begin
                    Source.Seek(0,soFromBeginning);
                    Destination.CopyFrom(Source,Source.Size);
                    end;
           { mcHuffman:Huffman_DeCompresse(Source,Destination);
            mcLZ:LZ_DeCompresse(Source,Destination);
            mcLZW:LZW_DeCompresse(Source,Destination); }
            mcZLib: begin
                    Source.Seek(0,soFromBeginning);
                    Source.Read(taille,sizeof(int64));
                    DStream := TDecompressionStream.Create(Source);
                    Destination.CopyFrom(DStream,t.Size);
                    DStream.Free;
            end;
            end;
    end;

  12. #12
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    ... en testant tu devrais trouver que cela vient uniquement en mcZLib.

    Reprends ton code. Je pense que tu es parti de cette source:
    http://theroadtodelphi.wordpress.com...ting-archives/
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Linkin Voir le message
    ... en testant tu devrais trouver que cela vient uniquement en mcZLib.
    j'ai testé avec mcHuffman {même problème}

    Citation Envoyé par Linkin Voir le message
    Reprends ton code. Je pense que tu es parti de cette source:
    http://theroadtodelphi.wordpress.com...ting-archives/
    oui c'est bien l'un des source que j'ai utilisé.
    je crois que je vais abandonné l'idée de créé un fichier temporaire et chercher d'autres solutions.

    merci Linkin et à tous les autres de m'avoir aider.
    je met ma requête résolu.

  14. #14
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
                    Source.Seek(0,soFromBeginning);
                    Source.Read(taille,sizeof(int64)); // à quoi sert cette variable ?
                    DStream := TDecompressionStream.Create(Source);
                    Destination.CopyFrom(DStream,t.Size); // t.Size devrait-il^valoir taille ?
                    DStream.Free;
            end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2009, 11h02
  2. Violation d'accès à l'adresse
    Par gentilman_delphi dans le forum Bases de données
    Réponses: 12
    Dernier message: 04/03/2008, 18h51
  3. Violation d'accès à l'adresse x
    Par Gremlins13 dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2007, 15h48
  4. Réponses: 2
    Dernier message: 18/11/2007, 09h11
  5. "violation d'acces à l'adresse" en sortie de primi
    Par netah25 dans le forum C++Builder
    Réponses: 20
    Dernier message: 18/01/2005, 11h22

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