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'access à l'adresse


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut Violation d'access à l'adresse
    Actuellement en stage, je m'essaye au Delphi (WebServices) mais malheureusement, je bute. J'ai passé toute la journée sur ce bug et je n'arrive pas (ni mes collegues) à débugguer ce programme. Je l'ai entierement refait mais rien n'y fait.

    Le principe :
    AskHello.exe appel CallHello.dll qui appel SayHello.dll
    SayHello.dll retourne 'Hello World!', CallHello se contente de renvoyer la phrase à AskHello qui l'affiche dans un prompt (ShowMessage).

    Si AskHello.exe appel directement SayHello, ça marche nikel mais sinon, CallHello (au moment du HTTPRIO) me retourne une erreur de violation d'acces. Une erreur d'écriture semble-t-il. Je pencherai pour une erreur de mémoire mais je buche quand meme.

    Voici les codes de CallHello (si besoin des autres, dites le) :
    CallMeHelloIntf.pas
    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
    { Interface invocable ICallMeHello }
     
    unit CallMeHelloIntf;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns;
     
    type
     
      { Les interfaces invocables doivent dériver de IInvokable }
      ICallMeHello = interface(IInvokable)
      ['{552410C3-B63F-401F-842B-100FC69B7345}']
     
        { Les méthodes de l'interface invocable ne doivent pas utiliser la convention }
        { d'appel par défaut ; stdcall est conseillée }
        function CallHello: WideString; stdcall;
      end;
     
    implementation
     
    initialization
      { Les interfaces invocables doivent être recensées }
      InvRegistry.RegisterInterface(TypeInfo(ICallMeHello));
     
    end.
    CallMeHelloWM.pas
    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
    { WebModule SOAP }
    unit CallMeHelloWM;
     
    interface
     
    uses
      SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo,
      WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
      SOAPHTTPDisp, WebBrokerSOAP;
     
    type
      TWebModule1 = class(TWebModule)
        HTTPSoapDispatcher1: THTTPSoapDispatcher;
        HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
        WSDLHTMLPublish1: TWSDLHTMLPublish;
        procedure WebModule1DefaultHandlerAction(Sender: TObject;
          Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      private
        { déclarations privées }
      public
        { déclarations publiques }
      end;
     
    var
      WebModule1: TWebModule1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    begin
      WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
    end;
     
    end.
    CallMeHelloDM.pas
    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
    Unit CallMeHelloDM;
     
    interface
     
    uses SysUtils, Classes, InvokeRegistry, Midas, SOAPMidas, SOAPDm, CallMeHelloIntf, ISayMeHello1,
      Rio, SOAPHTTPClient;
     
    type
      IDataModule = interface(IAppServerSOAP)
        ['{00DF6F75-BCD6-4C6F-848C-909AD5EDF9A5}']
      end;
     
      TDataModule = class(TSoapDataModule, IDataModule, IAppServerSOAP, IAppServer, ICallMeHello)
      HTTPRIO1: THTTPRIO;
      private
     
      public
        function CallHello: WideString; stdcall;
      end;
     
    implementation
     
    {$R *.DFM}
     
    procedure TDataModuleCreateInstance(out obj: TObject);
    begin
     obj := TDataModule.Create(nil);
    end;
     
    function TDataModule.CallHello: WideString;
    begin
      Result := (HTTPRIO1 as ISayMeHello).SayHello;
    end;
     
    initialization
       InvRegistry.RegisterInvokableClass(TDataModule, TDataModuleCreateInstance);
       InvRegistry.RegisterInterface(TypeInfo(IDataModule));
    end.
    ISayMeHello1.pas
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    // ************************************************************************ //
    // Les types déclaré dans ce fichier ont été générés à partir de données lues dans le fichier
    // WSDL décrit ci-dessous :
    // WSDL     : http://localhost/Projects/TestWS4/SayMeHello.dll/wsdl/ISayMeHello
    // Encodage : utf-8
    // Version  : 1.0
    // (16/04/2007 14:53:16 - 1.33.2.5)
    // ************************************************************************ //
     
    unit ISayMeHello1;
     
    interface
     
    uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
     
    type
     
      // ************************************************************************ //
      // Les types suivants mentionnés dans le document WSDL ne sont pas représentés
      // dans ce fichier. Ce sont soit des alias[@] de types représentés ou alors ils sont 
      // référencés mais jamais[!] déclarés dans ce document. Les types de la dernière catégorie
      // sont en principe mappés à des types Borland ou XML prédéfinis/connus. Toutefois, ils peuvent aussi
      // signaler des documents WSDL incorrects n'ayant pas réussi à déclarer ou importer un type de schéma.
      // ************************************************************************ //
      // !:string          - "http://www.w3.org/2001/XMLSchema"
     
     
      // ************************************************************************ //
      // Espace de nommage : urn:SayMeHelloIntf-ISayMeHello
      // soapAction : urn:SayMeHelloIntf-ISayMeHello#SayHello
      // transport : http://schemas.xmlsoap.org/soap/http
      // style     : rpc
      // liaison   : ISayMeHellobinding
      // service   : ISayMeHelloservice
      // port      : ISayMeHelloPort
      // URL       : http://localhost/Projects/TestWS4/SayMeHello.dll/soap/ISayMeHello
      // ************************************************************************ //
      ISayMeHello = interface(IInvokable)
      ['{A22080B6-5BD8-B41E-0DB5-534D22492D22}']
        function  SayHello: WideString; stdcall;
      end;
     
    function GetISayMeHello(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ISayMeHello;
     
     
    implementation
     
    function GetISayMeHello(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ISayMeHello;
    const
      defWSDL = 'http://localhost/Projects/TestWS4/SayMeHello.dll/wsdl/ISayMeHello';
      defURL  = 'http://localhost/Projects/TestWS4/SayMeHello.dll/soap/ISayMeHello';
      defSvc  = 'ISayMeHelloservice';
      defPrt  = 'ISayMeHelloPort';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as ISayMeHello);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
     
     
    initialization
      InvRegistry.RegisterInterface(TypeInfo(ISayMeHello), 'urn:SayMeHelloIntf-ISayMeHello', 'utf-8');
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ISayMeHello), 'urn:SayMeHelloIntf-ISayMeHello#SayHello');
     
    end.
    Un énorme merci d'avance ^^

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Comme déja indiqué (plusieurs fois) quand tu fais ce genre de projet, le plus simple c'est déja de faire un projet avec tout dedans. Puis quand ça marche tu génères plusieurs projets avec les dll. Sinon tu ne sais pas d'où vient le pb : de la mise en dll ou de la conception même.

  3. #3
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,

    Citation Envoyé par Korko Fain
    (...)
    Si AskHello.exe appel directement SayHello, ça marche nikel mais sinon, CallHello (au moment du HTTPRIO) me retourne une erreur de violation d'acces. Une erreur d'écriture semble-t-il. Je pencherai pour une erreur de mémoire mais je buche quand meme.
    (...)
    j'ai rapidement reproduit l'exemple que tu as donné (enfin si j'ai bien tout capté) et je n'ai aucun problème!

    pour moi cette unité ISayMeHello1 dans le uses n'a pas lieu d'etre louche dans le CallMeHelloDM.pas

    voici ce que j'ai fait tu pourras peut etre compare avec ton code

    Mon service web:

    interface IHello:
    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
     
    unit HelloIntf;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns;
     
    type
      IHello = interface(IInvokable)
      ['{369BAB7B-4C8C-4E2D-8F86-776072673661}']
        function SayHello: WideString; stdcall;
      end;
     
    implementation
     
    initialization
      InvRegistry.RegisterInterface(TypeInfo(IHello));
    end.
    implementation de IHello
    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
     
    unit HelloImpl;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns, HelloIntf;
     
    type
      THello = class(TInvokableClass, IHello)
      public
        function SayHello: WideString; stdcall;
      end;
     
    implementation
     
    { THello }
     
    function THello.SayHello: WideString;
    begin
      Result := 'Salut !';
    end;
     
    initialization
      InvRegistry.RegisterInvokableClass(THello);
    end.

    mon interface CallHello
    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
     
    unit CallHelloIntf;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns;
     
    type
      ICallHello = interface(IInvokable)
      ['{FE044282-27FE-4591-BA2F-CACF31F4E402}']
        function CallHello: WideString; stdcall;
      end;
     
    implementation
     
    initialization
      InvRegistry.RegisterInterface(TypeInfo(ICallHello));
    end.
    implementation de ICallHello via un TSoapDataModule
    c'est ici que tu as du te planter

    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
     
    Unit CallHelloDMUnt;
     
    interface
     
    uses SysUtils, Classes, InvokeRegistry, Midas, SOAPMidas, SOAPDm, Rio,
      SOAPHTTPClient, CallHelloIntf;
     
    type
      ICallHelloDM = interface(IAppServerSOAP)
        ['{670FCD76-013F-4C31-B628-C9CB4AEF7497}']
      end;
     
      TCallHelloDM = class(TSoapDataModule, ICallHelloDM, IAppServerSOAP, IAppServer, ICallHello)
        HTTPRIO1: THTTPRIO;
      private
     
      public
        function CallHello: WideString; stdcall;
      end;
     
    implementation
     
    uses HelloIntf;
     
    {$R *.DFM}
     
    procedure TCallHelloDMCreateInstance(out obj: TObject);
    begin
     obj := TCallHelloDM.Create(nil);
    end;
     
    { TCallHelloDM }
     
    function TCallHelloDM.CallHello: WideString;
    begin
      Result := (HTTPRIO1 as IHello).SayHello;
    end;
     
    initialization
       InvRegistry.RegisterInvokableClass(TCallHelloDM, TCallHelloDMCreateInstance);
       InvRegistry.RegisterInterface(TypeInfo(ICallHelloDM));
    end.
    tu as remarqué que j'utilise HelloIntf et mon HTTPRIO1 pointe sur le wsdl de du service Hello

    le client maintenant:

    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
     
    unit MainUnt;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, InvokeRegistry, StdCtrls, Rio, SOAPHTTPClient;
     
    type
      TForm1 = class(TForm)
        HTTPRIO1: THTTPRIO;
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses IcallHello1;
     
    {$R *.dfm}
     
    procedure TForm1.btn1Click(Sender: TObject);
    begin
      ShowMessage((HTTPRIO1 as ICallHello).CallHello);
    end;
     
    end.
    et voila ceci fonctionne....
    j'espère que ca va t'aider
    a+

  4. #4
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    Merci beaucoup. Je regarderai cela avec attention. L'interet de l'avoir déja découpé c'est au niveau conception justement. Ce sont des choses qui sont sensées etre totalement séparées puisque je dois travailler sur le coté "WebService" de la chose. Si je le fais en 1 seul projet il n'y a plus de séparation donc plus d'interet :p Déja que là il est limité vu les dll :p

  5. #5
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    petite précision je n'est pas genere des dll ISAPI mais
    des executables autonomes CGI

    Hello.exe et CallHello.exe

  6. #6
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    Ok moi ce sont des dll ISAPI mais il semblerai que cela vienne de mon IIS sur XP Pro qui n'aime pas gerer 2 dlls qui communiquent entre elles. Car sur un IIS de Server pas de pb (pour le meme code).

Discussions similaires

  1. Violation d'accès à l'adresse x
    Par Gremlins13 dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2007, 15h48
  2. Réponses: 2
    Dernier message: 18/11/2007, 09h11
  3. Violation access à l'adresse X
    Par Hypollite76 dans le forum Langage
    Réponses: 3
    Dernier message: 05/09/2007, 16h53
  4. extraire sous Access une adresse mail
    Par elmoino dans le forum Access
    Réponses: 4
    Dernier message: 09/07/2007, 12h05
  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