Appel des interfaces serveur

De RAD Studio
Aller à : navigation, rechercher

Remonter à Création de l'application client

Les applications n'ont pas besoin d'appeler l'interface IAppServer ou IAppServerSOAP directement, car les appels appropriés sont automatiquement réalisés lorsque vous utilisez les propriétés et méthodes de l'ensemble de données client. Cependant, alors qu'il n'est pas nécessaire de travailler directement avec l'interface IAppServer ou IAppServerSOAP, vous pouvez avoir ajouté vos propres extensions à l'interface du module de données distant. Quand vous étendez l'interface du serveur d'applications, vous devez être en mesure d'appeler ces extensions à l'aide de la connexion créée par votre composant connexion. Sauf si vous utilisez SOAP, vous pouvez effectuer cette opération à l'aide de la propriété AppServer du composant connexion. AppServer est un variant qui représente l'interface du serveur d'applications.

Pour appeler cette interface, vous devez obtenir une interface de répartition de ce variant. L'interface de répartition a le même nom que l'interface créée lors de la création du module de données distant, mais avec en plus la chaîne "Disp".

Ainsi, si votre module de données distant est appelé MyAppServer, vous pouvez utiliser AppServer pour appeler son interface dans C++, comme suit :

IDispatch* disp = (IDispatch*)(MyConnection->AppServer)
IMyAppServerDisp tempInterface( (IMyAppServer*)disp);
TempInterface.SpecialMethod(x,y);

Remarque : L'interface de répartition est déclarée dans le fichier _TLB.h généré par l'éditeur de bibliothèques de types.

Si vous n'utilisez pas SOAP, vous pouvez appeler une méthode d'interface à l'aide de AppServer en écrivant une instruction dans Delphi telle que :

MyConnection.AppServer.SpecialMethod(x,y);

Toutefois, cette technique offre une liaison tardive (dynamique) de l'appel d'interface. C'est-à-dire que l'appel de la procédure SpecialMethod n'est pas liée avant l'exécution lorsque l'appel est exécuté. La liaison tardive est très souple mais son utilisation vous prive de nombreux avantages tels que Code Insight et la vérification de type. De plus, la liaison tardive est plus lente que la liaison anticipée car le compilateur génère des appels supplémentaires vers le serveur pour configurer les appels d'interface avant de les invoquer.

Utilisation de la liaison anticipée avec DCOM

Quand vous utilisez DCOM comme protocole de communication avec Delphi, vous pouvez utiliser la liaison anticipée d'appels AppServer. Utilisez l'opérateur as pour transtyper la variable AppServer vers le descendant de IAppServer que vous avez créé quand vous avez créé le module de données. Par exemple :

with MyConnection.AppServer as IMyAppServer do
SpecialMethod(x,y);

Pour utiliser la liaison anticipée sous DCOM, la bibliothèque de types du serveur doit être recensée sur la machine client. Vous pouvez utiliser TRegSvr.exe fourni avec RAD Studio, pour recenser la bibliothèque de types.

Remarque : L'exemple TRegSvr fournit le source pour TRegSvr.exe et montre comment recenser une bibliothèque de types par programmation. Pour trouver l'exemple TRegSvr, cliquez sur Démarrer | Programmes | Embarcadero RAD Studio 10.2 Tokyo | Exemples et ouvrez le répertoire Object Pascal\VCL\TRegSvr.

Utilisation des interfaces de répartition avec TCP/IP ou HTTP

Quand vous utilisez TCP/IP ou HTTP, vous ne pouvez pas réellement utiliser la liaison anticipée mais, comme le module de données distant utilise une interface double, vous pouvez utiliser la dispinterface du serveur d'applications pour améliorer les performances d'une simple liaison tardive. La dispinterface porte le même nom que l'interface du module de données distant, suivi de la chaîne 'Disp'. Vous pouvez assigner la propriété AppServer à une variable de ce type pour obtenir la dispinterface. Ainsi, dans Delphi :

var
TempInterface: IMyAppServerDisp;
begin
  TempInterface :=IMyAppServerDisp(IDispatch(MyConnection.AppServer));
  // …
 TempInterface.SpecialMethod(x,y);
 // …
end;

Remarque : Pour utiliser la dispinterface, vous devez ajouter l'unité _TLB générée quand vous enregistrez la bibliothèque de types dans la clause uses de votre module client.

Appel de l'interface d'un serveur SOAP

Si vous utilisez SOAP, vous ne pouvez pas utiliser la propriété AppServer. En revanche, vous devez obtenir l'interface du serveur en appelant la méthode GetSOAPServer. Toutefois, avant d'appeler GetSOAPServer, vous devez effectuer les étapes suivantes :

Vous pouvez l'ajouter à votre application client en référençant un document WSDL qui décrit l'interface que vous voulez appeler. Notez que pour les serveurs SOAP, cette interface est entièrement distincte de l'interface du module de données SOAP. Pour obtenir des informations sur l'importation d'un document WSDL décrivant l'interface, voir Importation de documents WSDL.

L'unité qui déclare l'interface du serveur doit aussi la recenser avec le registre d'invocation. Pour obtenir des détails sur la façon de recenser des interfaces invocables, voir Présentation des interfaces invocables. Après l'importation d'un document WSDL dans C++, pour générer une unité déclarant et recensant l'interface, créez une instance de THTTPRio pour l'interface désirée :

THTTPRio *X = new THTTPRio(NULL);

Assignez ensuite l'URL utilisée par votre composant connexion à l'objet interfacé distant, en ajoutant le nom de l'interface que vous voulez appeler :

 X->URL = SoapConnection1.URL + "IMyInterface";

Vous pouvez maintenant utiliser la méthode QueryInterface afin d'obtenir une interface pour appeler les méthodes du serveur :

InterfaceVariable = X->QueryInterface(IMyInterfaceIntf);
if (InterfaceVariable)
{
InterfaceVariable->SpecialMethod(a,b);
}

Notez que l'appel à QueryInterface prend en argument le wrapper DelphiInterface pour l'interface invocable, plutôt que l'interface invocable elle-même.

Si vous utilisez SOAP, vous ne pouvez pas utiliser la propriété AppServer. En revanche, vous devez obtenir l'interface du serveur en appelant la méthode GetSOAPServer. Toutefois, avant d'appeler GetSOAPServer, vous devez effectuer les étapes suivantes :

  • Votre application client doit inclure la définition de l'interface du serveur d'application et la recenser avec le registre d'invocation. Vous pouvez ajouter la définition de cette interface à votre application client en référençant un document WSDL qui décrit l’interface que vous voulez appeler. Pour obtenir des informations sur l'importation d'un document WSDL décrivant l'interface du serveur, voir Présentation des interfaces invocables.
  • Le composant TSOAPConnection doit avoir ses interfaces invocables.
  • Vous devez définir la propriété SOAPServerIID du composant connexion SOAP sur le GUID de l'interface du serveur. Vous devez définir cette propriété avant que votre application ne se connecte au serveur, car elle indique au composant TSOAPConnection l'interface à récupérer sur le serveur.

Si les trois conditions précédentes sont respectées, vous pouvez récupérer l'interface du serveur dans Delphi comme suit :

with MyConnection.GetSOAPServer as IMyAppServer do
SpecialMethod(x,y);

Voir aussi