VisiBroker voor Delphi 5 |
Net als haar voorganger Delphi 4 (Client/Server), is Delphi 5 Enterprise in staat om CORBA clients en servers te produceren.
Iets dat echter tot voor kort onmogelijk was, is het compileren van CORBA IDL (Interface Definition Languiage) bestanden, en dat was erg jammer, want IDL bestanden bevatten nu juist het belangrijkste onderdeel van een CORBA applicatie: de definitie van de interface tussen de client en de server.
En zonder een IDL compiler (van IDL naar ObjectPascal) konden Delphi 5 CORBA servers wel door andere clients gebruikt worden (Delphi kon namelijk wel IDL bestanden produceren), maar konden CORBA servers gemaakt in andere omgevingen niet zo makkelijk door Delphi 5 CORBA clients gebruikt worden (want Delphi kon de IDL bestanden niet eenvoudig omzetten naar ObjectPascal klasse definities).
Daar is nu verandering in gekomen: VisiBroker 3.3 voor Delphi (of "voor Pascal", zoals de compiler officieel heet) genereert nu Pascal bestanden uit IDL bestanden: een heuse IDL2PAS dus.
Het installatiebestand VB_DELPHI.EXE van 3,798,655 is te downloaden van de Inprise website (na het invullen van een korte vragenlijst).
Na installatie, waarbij zoals gezegd de originele Delphi registratie code en key ingevoerd moeten worden - zoals bij elke update/patch van Delphi in het verleden - vinden we de ORBPAS33.DLL, IDL2PAS.BAT en IDL2PAS.JAT in de DELPHI5\BIN directory, een IDL2PAS subdirectory in de DEMOS directory (met verschillende voorbeelden, waarbij de CORBA server in C++Builder 4 geschreven is) en een IDL2PAS DOCS directory waar documentatie in HTML en PDF formaat te vinden is.
De HTML documentatie bevat de verwijzingen naar de voorbeelden en release notes, terwijl het PDF bestand de volledige 33-pagina tellende VisiBroker for Delphi reference manual is.
De laatste bevat twee hoofdstukken: de eerste (kort) betreffende de tools die we nu tot onze beschikking hebben (IDL2PAS en IDL2IR - hierover in een later artikel meer) en het tweede hoofdstuk betreft de IDL naar Pascal vertaling, waarbij we stuk voor stuk zien hoe en wat nu allemaal mogelijk is.
In de HTML documentatie is ook de grootste beperking van de nieuwe VisiBroker voor Delphi terug te vinden: het betreft namelijk alleen maar ondersteuning voor Delphi CORBA clients op basis van IDL bestanden.
Aangezien dit nu precies het lastige stuk was zonder IDL2PAS, zal ik maar niet gaan zeuren dat ik eigenlijk ook Delphi CORBA server skeletons uit IDL bestanden gegenereerd wil hebben.
Het is al mooi genoeg.
Voorlopig dan.
In Delphi 6 verwacht ik natuurlijk meer, maar dat zien we dan wel weer...
IDL2PAS
Laten we eens kijken hoe goed de IDL2PAS werkt, en wat we er precies uitkrijgen.
Als uitgangspunt neem ik de Delphi DrBob42 CORBA server en het daarbijhorende IDL bestand dat we in het Delphi 4 CORBA artikel al gebruikten.
De module DrBob42 bevat een interface ISDGN met één methode: TheAnswer.
Er zat tevens nog een SDGNFactory interface in want die was nodig om een instantie te maken, en zal ik nu weer gebruiken.
Als eerste voorbeeld zal ik dan ook onderstaande IDL definitie gebruiken:
module DrBob42 { interface ISDGN { void TheAnswer(out long Answer); }; interface SDGNFactory { ISDGN CreateInstance(in string InstanceName); } };De IDL naar Pascal compiler IDL2PAS verwacht als argument een .IDL bestand, maar kan ook een aantal command-line argumenten ontvangen. Met de aanroep "IDL2PAS -?" kunnen we zien welke mogelijkheden we allemaal hebben. Om een of andere reden is deze output te breed voor mijn NT commandline console of DOS-Box, maar gelukkig is een gedetailleerd overzicht ook in de PDF manual terug te lezen. En alhoewel de default waarden voor de command-line parameters vaak prima in orde zijn, geef ik de voorkeur aan eem extra -C optie (hiermee zien we commentaar dat in het IDL bestand staat terug in de gegenereerde Pascal bestanden). Een andere optie die nuttig kan zijn is de -idl_strict optie, waarmee we opgeven dat we ons strikt aan de OMG standaard interpretatie van IDL willen houden. Deze laatste optie is met name belangrijk als we CORBA clients moeten produceren uit IDL gegenereerd door een andere ontwikkelomgeving (zoals bijvoorbeeld JBuilder of C++Builder, waarmee de CORBA servers uit de DEMOS/IDL2PAS directory zijn gemaakt).
Factory := TSDGNFactoryHelper.Bind('SDGN');Als we een SDGN Factory hebben, kunnen we een instantie aanmaken door de method CreateInstance:
Client := Factory.CreateInstance('SDGN');Hierna kunnen we de Client gebruiken, en de ISDGN methods aanroepen (zoals de method TheAnswer). Het mooie van Delphi 5 is dat we hierbij ondersteuning krijgen van de Code Insight binnen de editor:
Tot slot moeten we niet vergeten om zowel de Client als de Factory op te ruimen na gebruik, door ze op nil te zetten. De complete source code komt er daardoor als volgt uit te zien:
uses CORBA, ORBPAS30, DrBob42_I, DrBob42_C; procedure TForm1.Button1Click(Sender: TObject); var Factory: SDGNFactory; Client: ISDGN; Answer: Integer; begin Factory := TSDGNFactoryHelper.Bind('SDGN'); Client := Factory.CreateInstance('SDGN'); Client.TheAnswer(Answer); Button1.Caption := IntToStr(Answer); Client := nil; Factory := nil end;Om te demonstreren dat het allemaal werkt moeten we de VisiBroker Smart Agent opstarten, gevolgd door de CORBA server die we in het Delphi 4 CORBA artikel schreven. Hierna kan de zojuist geschreven CORBA client gestart worden, en met een druk op de knop maken we een instantie die de methode TheAnswer aanroept (waarvan het antwoord verzorgd wordt door de server). En inderdaad, op mijn button verschijnt de tekst 42, maar ik nodig iedere gebruiker van Delphi 5 Enterprise uit om dit experiment zelf ook uit te voeren.
Conclusie
Vooral bij CORBA servers geschreven in andere omgevingen dan Delphi 5 is de VisiBroker for Delphi IDL2PAS compiler een onmisbaar stukje werk.
Hiervoor moesten we vaak aanmodderen met DII (Dynamic Interface Invocation) waarbij echte Code Insight ondersteuning in de editor wegviel, maar dat is nu niet langer nodig, omdat de IDL direct naar Pascal units gecompileerd wordt.
Naast dit simpele experiment is de CORBA ondersteuning zelf ook uitgebreid.
Zo is het nu mogelijk om structuren (records) door te geven als argument (voorheen alleen mogelijk in de oudere Delphi 3 Enterprise), en last but not least biedt VisiBroker for Delphi nu ook ondersteuning voor CORBA Exceptions.
Eindelijk mag ik wel zeggen, en ik ben er dan ook erg blij mee.
Mocht iemand nog vragen, opmerkingen of suggesties hebben, dan hoor ik die het liefst via .