Announcement

Collapse
No announcement yet.

Beispiele aus dem Buch Com/Dcom COM+

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Beispiele aus dem Buch Com/Dcom COM+

    Hallo,

    ich nutze Delphi 5 Professional unter Windows 2000, und wuerde gerne die Beispiele fuer den Micr. Sql Server 7 mit C/S (Kap. 16.8.2) durcharbeiten.

    Leider bringt er bei der Einbindung der MtsObj.dcu immer den Fehler das er diese Datei nicht finden kann!

    Liegt es evtl. an der Professional Version von Delphi 5?

    mfg
    Daniel Auth

  • #2
    Soviel ich weiß sind die MTS-Komponenten bei D5 erst in der Enterprise-Version dabei. Also hat man mit D5-Pro da schlechte Karten

    Comment


    • #3
      Hallo,

      >...Professional Version von Delphi 5?

      rein technisch gesehen reicht jede beliebige Delphi-Version aus, da COM+ von Windows 2000 (der Nachfolger vom MTS von NT 4.0) über COM-Schnittstellen erreicht wird. Der einzige Nachteil von Delphi 5 Professional besteht darin, dass die Interfaces von Hand eingebunden und deklariert werden müssen. Das folgende Beispiel demonstriert die Implementierung mit <b>Delphi 5 Professional</b>, die manuellen Arbeitschritte stehen gleich am Anfang im Kommentarblock. Entscheidend sind die Schritte 3 und 4 im Typbibliotheks-Editor und das nachträgliche Aufschalten über <b>CoGetObjectContext</b> - danach unterscheidet sich das Ganze nicht mehr von der Wizard-Umsetzung in der Enterprise-Version von Delphi:
      <pre>
      (*

      1. Datei Neu | ActiveX Bibliothek
      2. Datei Neu | Automatisierungsobjekt
      3. TLB-Editor: Registerseite Verwendet: COM+ Services-Typbibliothek hinzufügen
      4. TLB-Editor: CoClass-Registerseite Implementierung: IObjectControl hinzufügen
      5. Implementierungs-Unit: IObjectControl als 2. Interface dem TAutoObject-Nachfolger hinzufügen
      6. IObjectControl-Methoden aus COMSVCSLib_TLB kopieren und als
      Implementierung in den eigenen TAutoObject-Nachfolger einfügen
      7. CoGetObjectContext deklarieren
      8. Activate -> IObjectContext-Interfacezeiger abfordern

      *)

      unit D5PMTS_Impl;

      interface

      uses
      Windows, ComObj, ActiveX, D5PMTS_TLB, StdVcl, COMSVCSLib_TLB;

      type
      TD5PMTSObj = class(TAutoObject, IObjectControl, ID5PMTSObj)
      private
      FObjectContext: IObjectContext;
      protected
      // IObjectControl-Methoden aus COMSVCSLib_TLB kopieren
      function Activate: HResult; stdcall;
      procedure Deactivate; stdcall;
      function CanBePooled: Integer; stdcall;
      // ID5PMTSObj
      procedure DoWork(const sInput: WideString; out sMsg: WideString); safecall;
      { Protected-Deklarationen }
      property ObjectContext: IObjectContext read FObjectContext;
      end;

      implementation

      uses ComServ;

      function CoGetObjectContext(const iid: TIID;
      ppv: Pointer): HResult; stdcall;
      external 'ole32.dll' name 'CoGetObjectContext';

      function TD5PMTSObj.Activate: HResult;
      begin
      try
      OleCheck(CoGetObjectContext(IID_IObjectContext , @FObjectContext));
      Result := S_OK;
      except
      Result := E_NOTIMPL;
      end;
      end;

      function TD5PMTSObj.CanBePooled: Integer;
      begin
      Result := Integer(False);
      end;

      procedure TD5PMTSObj.Deactivate;
      begin
      FObjectContext := nil;
      end;

      procedure TD5PMTSObj.DoWork(const sInput: WideString;
      out sMsg: WideString);
      begin
      sMsg := sInput + ' (ok)';
      ObjectContext.SetComplete;
      end;

      initialization
      TAutoObjectFactory.Create(ComServer, TD5PMTSObj, Class_D5PMTSObj,
      ciMultiInstance, tmApartment);
      end.
      </pre&gt

      Comment

      Working...
      X