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 ^^