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 :

Acces Violation sur 2 Stream différents.


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Acces Violation sur 2 Stream différents.
    Bonsoir !

    J'en appelle à vous pour une petite incohérence sur laquelle je suis tombé dans mon code, qui me laisse perplexe ...

    Je déclare un TStream, et un TFileStream, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fichier_stream:TStream;
    Fichier_Serveur:TFileStream;
    Puis dans le code, ça ne plante pas en faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fichier_Serveur.Create('C:\Users\tdelsalle\Desktop\ARTICLE.PDF',fmOpenRead);    <-   Ça ne plante pas ...
    //Fichier_stream.Create;
    Mais ça plante en faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fichier_Serveur.Create('C:\Users\tdelsalle\Desktop\ARTICLE.PDF',fmOpenRead);    <-   Ça plante sur cette ligne là ! ...
    Fichier_stream.Create;
    En gros dans le 2ème cas, mon programme plante (avec un "Write on Access Violation"), juste si il y a un "Create" de l'AUTRE stream (à la ligne d'après ... )Sauf que le programme plante sur la ligne du premier Create ...

    Si quelqu'un saurait m'expliquer pourquoi


    PS: Il y avait d'autres lignes de code, mais en ne laissant que celle là (ou ces deux là) j'ai localisé le problème quoi, donc inutile de chercher un sens au programme sans le reste du code.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    pour créer un objet la syntaxe est Objet := TClass.Create et non Objet.Create qui appelle une méthode d'un objet non créé.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ah, oui, en effet, merci bien ...

    En fait j'ai découvert que j'avais pleins de soucis suite au fait que j'étais mal partit au début

    Je me suis fais une classe avec mon application cliente, qui appelle les fonctions de ma classe serveur, et celle qui me permet de télécharger les fichiers, se présente comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function TMyClassClient.DownloadFile(sFilePath: string): TStream;
    begin
      if FDownloadFileCommand = nil then
      begin
        FDownloadFileCommand := FDBXConnection.CreateCommand;
        FDownloadFileCommand.CommandType := TDBXCommandTypes.DSServerMethod;
        FDownloadFileCommand.Text := 'TMyClass.DownloadFile';
        FDownloadFileCommand.Prepare;
      end;
      FDownloadFileCommand.Parameters[0].Value.SetWideString(sFilePath);
      FDownloadFileCommand.ExecuteUpdate;
      Result := FDownloadFileCommand.Parameters[1].Value.GetStream(FInstanceOwner);
    end;
    Le problème c'est qu'à cause du "GetStream", je ne peux pas renvoyer un TFileStream !

    Et je ne trouve pas comment faire pour renvoyer directement un TFileStream


    J'utilise en local un CopyFrom (avec les TFileStream), mais avant ça j'essayait de copier les données venant du TStream serveur, mais ça ne fonctionne jamais pour le gros fichiers.

    Je ne saisis pas encore toutes les différences entres TStream et TFileStream, mais je suis un peu bloqué à cause de cette déclaration foireuse aux niveau de mes classes clients/serveur qui me renvoient un TStream au lieu du TFileStream (Si j'arrive à me faire renvoyer un TFileStream directement, ça serait beaucoup plus simple pour la suite !)

    Si je tape juste "Get" les propositions de l'EDI sont tout sauf FileStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GetValueSize:int64
    GetAnsiString:AnsiString
    GetDate:TDBXDate
    GetBoolean:boolean
    GetTime:TDBXTime
    GetWideString:string
    GetDouble:Double
    GetUInt8:ShortInt
    GetBytes:int64
    Et beaucoup d'autres, dont le Stream, mais pas de FileStream
    Enfin voilà si quelqu'un connait une variation de "GetStream" valable avec un TFileStream, je serai heureux !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Quelqu'un aurait une aide à m'apporter ?

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Citation Envoyé par Mozarella Voir le message
    Je me suis fais une classe avec mon application cliente, qui appelle les fonctions de ma classe serveur
    Quelle technologie Client\Serveur ?
    WebService et Objet Remotable SOAP (limité par le serveur web, configurable)
    DataSnap et WS REST (pense à la limite TDSTCPServerTransport.BufferKBSize)
    DCOM
    Maison à base de TCP\IP
    ???

    Citation Envoyé par Mozarella Voir le message
    Je ne saisis pas encore toutes les différences entres TStream et TFileStream, ... ça serait beaucoup plus simple pour la suite !
    Un TFileStream possède toute le méthode d'un TStream, en réalité, le TFileStream ne doit ajouter que la propriété FileName rapport au THandleStream
    TFileStream ne facilite en rien la manipulation, je ne vois pas en quoi cela serait plus simple pour la suite ?

    Il y a un toturiel à ce sujet Traiter des fichiers de grande taille via THandleStream

    N'oublie pas de faire remettre la Position à zéro ou faire un Seek après un Load si tu veux relire ce que tu as écrit dans le Stream, imagine le commune Bande que l'on roule et déroule !

    Entre Client\Serveur, il n'y aura pas d'échange d'objet TFileStream, un TStream oui car c'est un concept abstrait, le Client ne doit pas connaître l'origine du Stream et n'a besoin que des fonctions Read !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut, désolé du retard.
    La technologie c'est Rest DataSnap (taille max à 1000 du bufferKBSize)
    Mais je viens de vérifier, le soucis c'est que ça ne fonctionne avec aucun fichier supérieur à 63.9 KO (soit 16bits ?).

    Donc ça ne vient pas de la taille du buffer du TDSTCPServeurTransport, je ne pige toujours pas :/

Discussions similaires

  1. [eZ Publish] Accès site eZ Publish sur un serveur différent
    Par 3Fred9 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 06/06/2012, 09h48
  2. acces serveur NFS sur 2 réseaux différents
    Par babe7 dans le forum Réseau
    Réponses: 0
    Dernier message: 23/03/2012, 10h17
  3. Problème d’accès DB : application C/S sur deux domaines différents
    Par nabsoft1977 dans le forum Connexions aux bases de données
    Réponses: 0
    Dernier message: 04/12/2011, 01h49
  4. Réponses: 12
    Dernier message: 30/11/2009, 00h12
  5. Réponses: 7
    Dernier message: 22/01/2008, 15h18

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