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

Web & réseau Delphi Discussion :

Access violation dans un Web service retournant un tableau de valeurs


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Access violation dans un Web service retournant un tableau de valeurs
    Bonjour

    J'ai écrit la partie serveur d'un web service, mais son exécution renvoie l'erreur "Violation d'accès à l'adresse 022C107E dans le module 'Project1.dll"

    L'erreur se produit sur la ligne suivante, lors de l'affectation de la valeur de la requète à Mon_Portefeuille[Nb_Client].Num_client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_Portefeuille[Nb_Client].Num_client  := FieldByName('num_client').Value;
    Je pense que problème vient du fait que le tableau Mon_Portefeuille n'est pas créé, mais comment le créer ?

    Merci d'avance pour vos réponses


    Voici ci-dessous la descrition de l'interface :
    -------------------------------------------

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns;
     
    type
      Enr = Class;
     
      Enr = Class(TRemotable)
      private
        FNum_client  : integer;
        FDesignation : widestring;
        FQualite     : Widestring;
      published
        property Num_client  : integer    read FNum_client  write FNum_client;
        property Designation : widestring read FDesignation write Fdesignation;
        property Qualite     : widestring read FQualite     write FQualite;
      end;
     
      Portefeuille = array of Enr;
     
      { Les interfaces invocables doivent dériver de IInvokable }
      ITestIO = interface(IInvokable)
      ['{7BA0A86E-0CCC-42F1-9828-F8EDE440CBE1}']
     
     
      function Lit_Portefeuille(Code_agent : integer) : Portefeuille ; stdcall;
     
     
        { Les méthodes de l'interface invocable ne doivent pas utiliser la convention }
        { d'appel par défaut ; stdcall est conseillée }
      end;
     
    implementation
     
    initialization
      { Les interfaces invocables doivent être recensées }
      InvRegistry.RegisterInterface(TypeInfo(ITestIO));
     
    end.
    et l'implémentation :
    -------------------
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    { Fichier d'implémentation invocable pour TTestIO qui implémente ITestIO }
     
    unit TestIOImpl;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns, TestIOIntf, cer_fichiers, sysutils;
     
    type
     
      { TTestIO }
      TTestIO = class(TInvokableClass, ITestIO)
      public
        function Lit_Portefeuille(Code_agent : integer) : Portefeuille ; stdcall;
      end;
     
    implementation
     
    uses Unit1, Unit2;
     
      function TTestIO.Lit_Portefeuille(Code_agent : integer) : Portefeuille;
      var MyDataModule : TDataModule;
          Mon_Portefeuille : Portefeuille;
          Nb_Client : integer;
      begin
        MyDataModule := TDataModule.create(nil);
     
        try
          With MyDataModule.QPortefeuille do
          begin
            Close;
            ParamByName('code_agent').Value := Code_agent;
            Open;
            Nb_Client := 0;
     
            While not Eof do
            begin
              inc(Nb_Client);
              Mon_Portefeuille[Nb_Client].Num_client  := FieldByName('num_client').Value;
              Mon_Portefeuille[Nb_Client].Designation := FieldByName('designation').Value;
              Mon_Portefeuille[Nb_Client].Qualite     := FieldByName('qualite').Value;
              Next;
            end;
            Close;
          end;
        finally
          FreeAndNil (MyDataModule);
        end;
     
        result := Mon_Portefeuille;
      end;
     
     
    initialization
      { Les classes invocables doivent être recensées }
      InvRegistry.RegisterInvokableClass(TTestIO);
     
    end.

  2. #2
    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
    s'attaquer au WebService si tu es débutant n'est pas forcément le plus aisé, il vaut mieux être habitué au constructeur\destructeur ainsi que les tableaux dynamiques

    3 erreurs
    - SetLength manquant
    - Create manquant
    - incrémentation prématuré pour tableau indice en 0

    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
     
          With MyDataModule.QPortefeuille do
          begin
            Close;
            ParamByName('code_agent').Value := Code_agent;
            Open;
            Nb_Client := 0;
            SetLength(Mon_Portefeuille, RecordCount); //         
     
            While not Eof do
            begin
              // SetLength(Mon_Portefeuille, Nb_Client + 1); // si RecordCount n'est pas supporté comme avec DBExpress
     
              Mon_Portefeuille[Nb_Client] := Enr.Create(); 
              Mon_Portefeuille[Nb_Client].Num_client  := FieldByName('num_client').Value;
              Mon_Portefeuille[Nb_Client].Designation := FieldByName('designation').Value;
              Mon_Portefeuille[Nb_Client].Qualite     := FieldByName('qualite').Value;
              inc(Nb_Client);
              Next;
            end;
            Close;
          end;
    Côté Serveur j'ignore qui est responsable de la libération des objets, voir la documentation à ce sujet
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Remerciement
    J'ai corrigé le programme comme indiqué par ShaiLeTroll et tout fonctionne parfaitement !
    Merci encore pour votre réactivité

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

Discussions similaires

  1. authentification dans un web service
    Par sophiesophie dans le forum Services Web
    Réponses: 2
    Dernier message: 08/08/2008, 08h37
  2. probleme dans mon web service
    Par am@123 dans le forum Services Web
    Réponses: 2
    Dernier message: 06/05/2007, 19h31
  3. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  4. [C#2.0] Comment rendre obligatoire un element dans un Web Service
    Par cosmos38240 dans le forum Services Web
    Réponses: 1
    Dernier message: 02/03/2007, 16h27
  5. Access violation dans un TTreeView
    Par Vulcanos dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/09/2005, 03h58

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