MODULE ComKoalaTst;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   IMPORT COM, WinApi, WinOle, StdLog;

   
   CONST
      KoalaId = "{00021146-0000-0000-C000-000000000046}";
      nMax = 10;
      
   VAR
      factory: WinOle.IClassFactory;
      koala: ARRAY nMax OF COM.IUnknown;
      n: INTEGER;
      
   PROCEDURE CreateClass*;
      VAR res: INTEGER;
   BEGIN
      res := WinOle.CoGetClassObject(KoalaId, WinOle.CLSCTX_LOCAL_SERVER, 0, COM.ID(factory), factory);
      IF res = WinApi.S_OK THEN StdLog.String("Class creation succeeded"); StdLog.Ln
      ELSE StdLog.String("Class creation failed, error = "); StdLog.Int(res); StdLog.Ln
      END
   END CreateClass;
   
   PROCEDURE ReleaseClass*;
   BEGIN
      factory := NIL
   END ReleaseClass;
   
   PROCEDURE CreateInstance*;
      VAR res: INTEGER;
   BEGIN
      IF factory # NIL THEN
         res := factory.CreateInstance(NIL, COM.ID(COM.IUnknown), koala[0]); n := 1;
         IF res = WinApi.S_OK THEN StdLog.String("Instance creation succeeded"); StdLog.Ln
         ELSE StdLog.String("Instance creation failed, error = "); StdLog.Int(res); StdLog.Ln
         END
      ELSE StdLog.String("Creation failed, class not yet created."); StdLog.Ln
      END
   END CreateInstance;
   
   PROCEDURE AddRef*;
   BEGIN
      IF (n > 0) & (n < nMax) THEN koala[n] := koala[n-1]; INC(n) END
   END AddRef;
   
   PROCEDURE Release*;
   BEGIN
      IF n > 0 THEN DEC(n); koala[n] := NIL END
   END Release;
   
END ComKoalaTst.
ComKoala.Register

ComKoala.Unregister
ComKoalaTst.CreateClass

ComKoalaTst.ReleaseClass
ComKoalaTst.CreateInstance

ComKoalaTst.AddRef
ComKoalaTst.Release