Announcement

Collapse
No announcement yet.

ROT (Running Object Table)

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

  • ROT (Running Object Table)

    Hallo Herr Kosch (und alle anderen ),

    in Ihrem COM+ Buch haben Sie auf Seite 458 ein Beispiel
    das zeigt wie der Client den Automationsserver nutzt
    der eventuell in der ROT schon eingetragen ist.

    Wie müsste dieses Beispiel aussehen wenn der Client
    mit der späten Bindung arbeitet?

    Vielen Dank.

    PS:
    Muss es in Zeile 1 nicht heissen "GetActiveOLEObject"
    anstelle von GetActiveObject? Die letztere Funktion meckert
    Delphi an.

  • #2
    Hallo,

    es gibt sowohl <b>GetActiveObject</b> (Win32-API-Funktion) als auch <b>GetActiveOLEObject</b> (Delphi-Funktion, die jedoch intern GetActiveObject aufruft). Beide sind am Ende identisch. Der Compiler sollte GetActiveObject erkennen, wenn die Unit <b>ActiveX</b> eingebunden wird - was bei meinem o.g. Beispiel aus dem Buch der Fall ist:
    <pre>
    uses ActiveX;

    procedure TForm1.ButtonConnectClick(Sender: TObject);
    var
    swMsg : WideString;
    aSrvObj : IUnknown;
    begin
    GetActiveObject(CLASS_ROTServer2, nil, aSrvObj);
    if Assigned(aSrvObj) then
    begin
    FROTSrv := aSrvObj as IROTServer2;
    swMsg := 'Connect mit ROT-Instanz';
    end
    else
    begin
    FROTSrv := CoROTServer2.Create;
    swMsg := 'Connect mit neuer Instanz';
    end;
    StatusBar1.SimpleText := swMsg;
    FROTSrv.Connect(GetCurrentThreadID, Now, swMsg);
    ListBoxMsg.Items.Add(swMsg);
    end;
    </pre>
    Um die späte Bindung zu nutzen, darf der von GetActiveObject zurückgelieferte IUnknown-Interface-Zeiger nicht über AS in das Interface IROTServer2 eingetauscht werden, sondern muss einer OleVariant-Variante zugewiesen werden.

    Aber wozu soll das gut sein? Mit der späten Bindung handelt man sich bis auf wenige Ausnahmefälle nur Nachteile ein

    Comment


    • #3
      Danke.

      Aber woher bekomme ich wenn ich die TypeLib nicht im Programm
      habe den Wert "CLASS_ROTServer2" den Sie der GetActiveObject Methode übergeben

      Comment


      • #4
        Hallo,

        wenn man eine CLASS_ID absichtlich über die späte Bindung nicht nutzt, bedeutet dies nicht, dass sie nicht in der Registry vorhanden ist. Delphi stellt in der Unit <b>ComObj</b> die Funktion <b>ProgIDToClassID</b> bereit, so dass man die ProgID (Zeichenkette) jederzeit gegen die CLASS_ID eintauschen kann:
        <pre>
        function ProgIDToClassID(const ProgID: string): TGUID;
        begin
        OleCheck(CLSIDFromProgID(PWideChar(WideString(Prog ID)), Result));
        end;
        </pre>
        P.S: Die Details dazu können in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> auf den Seiten 144-146 nachgelesen werden

        Comment


        • #5
          Vielen Dank ;

          Comment

          Working...
          X