Bob Swart (aka Dr.Bob)
VisiBroker voor Delphi 5

Sinds eind 1999 is VisiBroker 3.3 beschikbaar voor Delphi 5 (Enterprise) gebruikers. Het is gratis te downloaden van de Inprise website, maar pas op: je hebt je (Delphi 5) registratie code en autorisatie key nodig bij het installeren van VisiBroker 3.3, dus vrijblijvend downloaden en bekijken is niet voor iedereen weggelegd.

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).
Nadat we het DRBOB42.IDL bestand met bovenstaande inhoud door de IDL2PAS compiler hebben gehaald krijgen we als resultaat een tweetal nieuwe bestanden: DRBOB42_C.PAS (van 11.165 bytes) en DRBOB42_I.PAS (2.553 bytes). Beide bestanden bevatten waarschuwingen die aangeven dat we ze niet mogen wijzigen, maar dat wijzigingen in het originele IDL bestand moeten plaatsvinden, waarna een nieuwe compilatie met IDl2PAS de nieuwe DRBOB42_C.PAS en DRBOB42_I.PAS zullen genereren. Dat was al zo met de CORBA Type Libraries (zie het Delphi 4 CORBA artikel maar weer), dus dat is niet zo'n verrassing meer.
Nu we deze twee gegenereerde units hebben, is de vraag natuurlijk: wat nu? Hoe maken we hier een CORBA client toepassing van die kan communiceren met de DRBOB42 CORBA server? Daarvoor moeten we even in deze units kijken. Het blijkt dat de DRBOB42_I.PAS (het kleinste bestand) de interfaces en variabelen definieert die in de DRBOB42_C.PAS client gebruikt worden. Het deel _I staat dus voor interface, en _C voor client. En dat betekent inderdaad dat we in de toekomst ook een _S zouden kunnen verwachten, voor een gegenereerde server unit.
In ieder geval bevat de DRBOB42_I.PAS unit de ISDGN en SDGNFactory interface definities. De DRBOB42_C.PAS unit bevat de TISDGNHelper & TISDGNStub evenals de TSDGNFactoryHelper & TSDGNFactoryStub classes; zowel de definitie als de implementatie. Met behulp van de TSDGNFactoryHelper kunnen we een SDGNFactory verkrijgen, waarmee we dan tenslotte een ISDGN interface kunnen benaderen. Dit alles zal ik straks in een paar regels code laten zien, uiteraard.
Allereerst moeten we de units CORBA en ORBPAS30 aan onze uses clause toevoegen. De eerste bevat de algemene CORBA zaken, de tweede de VisiBroker voor Pascal specifieke zaken. Daarnaast moeten we de units DRBOB42_C.PAS (voor de SDGNFactory definitie) en de DRBOB42_I.PAS (voor de ISDGN interface definitie) toevoegen aan onze uses clause.
De SDGN Factory kunnen we verkrijgen door een aanroep naar de class method Bind:
  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 .


Dit artikel is eerder verschenen in SDGN Magazine eind 1999

This webpage © 1999-2006 by webmaster drs. Robert E. Swart (aka - www.drbob42.com). All Rights Reserved.