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
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 { 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.
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 { 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.
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 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.
Un énorme merci d'avance ^^
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.
Partager